티스토리 뷰
728x90
반응형
Django에서 기본적으로 제공하는 User 모델을 사용할 수 있지만, 프로젝트 요구사항에 따라 사용자 모델을 직접 커스터마이징해야 할 때가 있다.
Django에서는 AbstractUser와 AbstractBaseUser라는 두 가지 추상 클래스를 통해 사용자 모델을 커스터마이징할 수 있다.
AbstractUser는 기본적으로 제공되는 필드를 유지하면서 필요한 필드를 추가할 때 사용 가능하고,
AbstractBaseUser는 사용자 모델을 완전히 새로 정의할 때 사용 가능하다.
이 두 가지 클래스는 구체적으로 어떤 필드와 동작을 제공하는지 살펴보자.
사전 설정
먼저 AbstractUser 나 AbstractBaseUser 클래스를 상속받아 생성한다면 settings.py를 변경해주어야 한다.
# projectname/settings.py
# 사용법: {App 이름}.{Model 이름}
AUTH_USER_MODEL = "user.User"
AbstractUser
Django의 기본 User 모델을 확장할 수 있도록 설계된 추상 클래스이다.
기본 사용자 모델을 사용하면서 몇 가지 필드만 추가하고 싶은 경우 사용한다.
- 기본 필드
- username: 기본 인증에 사용되는 사용자 ID
- first_name: 사용자 이름
- last_name: 사용자 성
- email: 이메일 주소
- password: 해시된 비밀번호
- is_staff: 관리 사이트 접근 가능 여부
- is_active: 사용자 활성화 상태 여부
- is_superuser: 슈퍼유저 권한 여부
- last_login: 마지막 로그인 시간
- date_joined: 계정 생성 시간
- 기본 코드
from django.contrib.auth.models import AbstractUser
class NyUser(AbstractUser):
username = None # 기존 필드 제거
age = models.IntegerField() # 새로운 필드 추가
2. AbstractBaseUser
사용자 모델을 완전히 재정의해야 할 때 사용하는 추상 클래스이다.
사용자 모델을 이메일 기반으로 만들거나, ID 시스템을 완전히 재정의하고 싶은 경우 사용한다.
- 기본 필드
- password: 해시된 비밀번호
- last_login: 마지막 로그인 시간
- is_active: 사용자 활성화 상태 여부
- 필수 구현 사항
- Django의 인증 시스템과 통합되기 위해 반드시 구현해야 하는 사항이다.
- USERNAME_FIELD
- 인증에서 고유 식별자인 사용자 ID로 사용할 필드 이름을 말한다. (username, email)
- 로그인, 토큰 발행 등에 사용된다.
- REQUIRED_FIELDS
- superuser 생성 시 필요한 필드 목록을 말한다.
- 빈 리스트로 설정할 수 있다.
- CustomUserManager 클래스
- create_user(일반 사용자 생성)와 create_superuser(admin 관리 권한이 있는 superuser 생성) 메서드를 포함하는 CustomUserManager 클래스를 설정해야 한다.
- 필드 검증과 초기화 처리하는데 사용되는 메서드들이다.
- USERNAME_FIELD
- Django의 인증 시스템과 통합되기 위해 반드시 구현해야 하는 사항이다.
- 기본 코드
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, username, email, password=None, **extra_fields):
# 일반 사용자 생성
if not email:
raise ValueError('Users must have an email address')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email, password=None, **extra_fields):
# superuser 생성
user = self.create_user(username, email, password, **extra_fields)
user.is_admin = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
age = models.IntegerField()
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
...
objects = CustomUserManager()
USERNAME_FIELD = "username"
REQUIRED_FIELDS = ["age"]
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
# 사용자 권한 확인
return True
def has_module_perms(self, app_label):
# 사용자 app_label 앱을 볼 수 있는 권한 확인
return True
@property
def is_staff(self):
# 직원(staff) 여부 확인
return self.is_admin
출처
728x90
반응형
댓글