# 개인 학습용 기록글 입니다
다중권한의 목표
- 고객용/점주용/슈퍼호스트 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클래스를 이용하여 권한을 부여, 기본적으로는 고객으로 설정