코규리
article thumbnail

# 개인 학습용 기록글 입니다 

 

다중권한의 목표

  • 고객용/점주용/슈퍼호스트 3가지의 권한을 만든다
  • 고객용/점주용에 따른 추가필드를 만든다
  • 점주는 고객정보를 편집할 수 있는 권한이 있어야 한다

만들 django Backend 자료의 틀을 우선으로 만들고, 각 앱(커뮤니티, 기관, 유저 등)을 다시 deep deep하게 만들어보자

 

 

[users > models.py]

1. 패키지 가져오기

from django.contrib.auth.models import (
    AbstractBaseUser,
    BaseUserManager,
    PermissionsMixin,
)
from django.db import models
import uuid
  • UUID: 어떤 개체를 고유하게 식별하는 데 사용되는 16바이트 길이의 숫자. 32개의 16진수로 구성됨
    이러한 uuid는 python에서 모듈로 제공되어있음.
  • AbstractBaseUser, BaseUserManager : 기존에는 AbstractUser로 기본적인 id, password, email 속성을 가져다 썼으나 불필요한 요소가 있어서 나의 맞춤용으로 작성하기 위해 base를 상속받기로 함
  • PermissionsMixin : 운영자 권한 클래스

 

 

2. 상태 속성 만들어주기

계정의 활동상태와 계정의 권한 설정을 위한 속성들을 제작해준다

USER_STATUS = {
    "ACTIVE": "ACTIVE",  # 활동 계정
    "STOP": "STOP",  # 정지(탈퇴)
    "PAUSE": "PAUSE",  # 휴면 계정
    "BAN": "BAN",  # 정지 계정
}

ROLES = {
    "ROLE_CLIENT": "CLIENT",  # 일반 사용자
    "ROLE_MANAGER": "MANAGER",  # 점주
    "ROLE_SUPER": "SUPER",  # 슈퍼 관리자
}

 

 

 

3. Auth클래스 작성

class Auth(models.Model):
    user = models.ForeignKey(User, related_name='auths', on_delete=models.CASCADE)
    role = models.CharField(max_length=30, default=ROLES.get('ROLE_CLIENT', 'CLIENT'))
  • ForeignKey: FK(외래키), 두 테이블을 서로 연결하는 데 사용됨. 
    부모 테이블: 외래키 값을 제공하는 테이블, 자식테이블: 외래키가 포함된 테이블
    외래키 값은 NULL이거나 부모 테이블의 기본키 값과 동일해야한 (참조 무결성)
    부모 테이블의 기본키/고유키를 외래키로 지정가능
    외래키 옵션으로 on_delete, on_update가 있는데 나중에 공부하자.
  • FK값을 사용하기 위해선 사실, User클래스가 먼저 작성되어 있어야 함
  • defaut는 고객으로 설정

 

 

4. UserManager클래스 작성

class UserManager(BaseUserManager):
    def create_user(self, email, nickname, password=None):

        if not email:
            raise ValueError("이메일은 필수 입니다.")
        if not password:
            raise ValueError("패스워드는 필수 입니다.")

        user = self.model(email=self.normalize_email(email), nickname=nickname)
        user.set_password(password)
        user.save(using=self._db)
        self.create_auth(user, ROLES.get("ROLE_CLIENT", "CLIENT"))
        return user

    def create_superuser(self, email, nickname, password):
        user = self.create_user(
            email=self.normalize_email(email), nickname=nickname, password=password
        )

        user = self.create_user(email, nickname, password)
        user.is_superuser = True
        user.is_staff = True
        user.is_active = True
        user.save(using=self._db)
        return user

 # 권한 등록 함수
    def create_auth(self, user, role=ROLES.get("ROLE_CLIENT", "CLIENT")):
        role_obj = Auth(user=user, role=role)
        role_obj.save(using=self.db)
        return role_obj
  • normalize_email:  @도메인 부분을 소문자로 바꿔줌
  • set_password: 비밀번호를 해시기법을 통해 저장
  • using=self._db: 저장할 데이터베이스를 정의, 데이터베이스가 여러 개일 경우 이런식으로 작성하게 됨.
    setting.py의 DATABASES = {}를 참고
    +참고 주소
  • create_auth: 앞서 만든 권한을 발생시킨다
  • is_superuser, is_staff, is_active: 속성 기본 설정
  • def create_auth: Auth클래스를 이용하여 권한을 부여, 기본적으로는 고객으로 설정