티스토리 뷰

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 클래스를 설정해야 한다.
        • 필드 검증과 초기화 처리하는데 사용되는 메서드들이다.
  • 기본 코드
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

 

출처

Django에서 인증 사용자 정의 | Django 문서 | 장고(Django)

728x90
반응형
댓글