Django에 대하여(21)_Authentication System
1. Django Authentication System (인증 시스템)
Django Authentication System이란, 사용자 인증과 관련된 기능을 모아 놓은 시스템입니다.
Authentications이란, 사용자가 자신이 누구인지 확인하는 것으로 즉, 신원 확인입니다.
1.1 사전 준비
두 번째 app accounts 생성 및 등록을 해야 합니다. auth와 관련한 경로나 키워드들을 django 내부적으로 accounts라는 이름으로 사용하고 있기 때문에 되도록 'accounts'로 지정하는 것을 권장합니다.
# accounts/urls.py
from django.urls import path
from . import views
app_name = 'accounts'
urlpatterns = [
]
# crud/urls.py
urlpatterns = [
...,
path('accounts/', include('accounts.urls')),
]
2. Custom User model
django가 기본적으로 제공하는 user model은 내장된 auth 앱의 User 클래스를 사용하기 때문에 Custom User model로 '대체'해야 합니다.
2.1 내장된 auth 앱
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
2.2 User 클래스를 대체하는 이유
- 우리는 지금까지 별도의 User 클래스 정의 없이 내장된 User 클래스를 사용했습니다.
- 별도의 설정 없이 사용할 수 있어 간편하지만, 개발자가 직접 수정할 수 없는 문제가 존재합니다.
https://github.com/django/django/blob/main/django/contrib/auth/models.py#L405
django/django/contrib/auth/models.py at main · django/django
The Web framework for perfectionists with deadlines. - django/django
github.com
2.3 대체하기
AbstractUser를 상속받는 커스텀 User 클래스를 작성합니다. 기존 User 클래스도 AbstractUser를 상속받기 때문에 커스텀 User 클래스도 기존 user 클래스와 완전히 같은 모습을 가지게 됩니다.
# accounts/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
django 프로젝트가 사용하는 기본 User 모델을 우리가 작성한 User 모델로 지정합니다. 수정 전 기본 값은 'auth.User'입니다.
# settings.py
AUTH_USER_MODEL = 'accounts.User'
기본 User 모델이 아니기 때문에 등록하지 않으면 admin site에 출력되지 않습니다.
# accounts/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
주의!! 프로젝트 중간에 AUTH_USER_MODEL을 변경 할 수 없습니다. 이미 프로젝트가 진행되고 있을 경우 데이터베이스 초기화 후 진행해야 합니다.
프로젝트를 시작하며 반드시 User 모델을 대체해야 합니다.
- Django는 새 프로젝트를 시작하는 경우 비록 기본 User 모델이 충분하더라도 커스텀 User 모델을 설정하는 것을 강력하게 권장하고 있습니다.
- 커스텀 user 모델은 기본 User 모델과 동일하게 작동 하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문입니다.
단, User 모델 대체 작업은 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 합니다.
참고
1. github 코드 참고
- AuthenticationForm() https://github.com/django/django/blob/main/django/contrib/auth/models.py#L199
- AuthenticationForm의 get_user 인스턴스 메서드 https://github.com/django/django/blob/main/django/contrib/auth/models.py#L269
django/django/contrib/auth/models.py at main · django/django
The Web framework for perfectionists with deadlines. - django/django
github.com
2. User 모델 상속 관계
3. 'AbstractUser' class
4. Abstract base classes (추상 기본 클래스)
5. 유저 모델 대체하기 Tip