07_django_custom_authentication
User model 대체하기
https://docs.djangoproject.com/en/3.1/topics/auth/customizing/#auth-custom-user
- 일부 프로젝트에서는 Django의 내장 유저 모델이 제공하는 인증 요구사항이 적절하지 않을 수 있다.
- django는 custom model을 참조하는
AUTH_USER_MODEL
설정을 제공하여 default user model을 재정의(override)할 수 있도록 한다. - django는 새 프로젝트를 시작하는 경우 기본 사용자 모델이 충분하더라도 커스텀 유저 모델을 설정하는 것을 강력하게 권장(highly recommended)
- 커스텀 유저 모델은 기본 사용자 모델과 동일하게 작동하지만 필요한 경우 나중에 맞춤 설정할 수 있기 때문이다.
- 단, 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 한다.
# settings.py
AUTH_USER_MODEL = 'accounts.User'
# accounts/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
# 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
https://docs.djangoproject.com/en/3.1/ref/settings/#auth-user-model
- User를 나타내는데 사용하는 모델
- 주의 사항
- 프로젝트를 진행하는 동안 (즉, 프로젝트에 의존하는 모델을 만들고 마이그레이션 한 후) 설정은 변경할 수 없다. (변경하려면 큰 노력이 필요)
- 프로젝트 시작 시 설정하기 위한 것이며, 참조하는 모델은 첫번째 마이그레이션에서 사용할 수 있어야 함
데이터베이스 초기화 후 마이그레이션 (프로젝트 중간이라면)
- migrations 파일 삭제
- db.sqlite3 삭제
- migrations 진행
AbstractUser
vs AbstractBaseUser
https://github.com/django/django/blob/main/django/contrib/auth/base_user.py#L47
https://github.com/django/django/blob/main/django/contrib/auth/models.py#L321
AbstractBaseUser
- password 와 last_login 만 기본적으로 제공
- 자유도가 높지만 필요한 필드는 모두 작성해야 함
AbstractUser
- 관리자 권한과 함께 완전한 기능을 갖춘 사용자 모델을 구현하는 기본 클래스
Custom user and built-in auth forms
- 유저모델 대체 후 회원가입 시 에러 발생
- AbstractBaseUser의 모든 subclass와 호환되는 forms
- AuthenticationForm, SetPasswordForm, PasswordChangeForm, AdminPasswordChangeForm
- User와 연결되어 있어서 커스텀 유저 모델을 사용하려면 다시 작성하거나 확장해야 하는 forms
- UserCreationForm, UserChangeForm
UserCreataionForm()
재정의
# accounts/forms.py
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = get_user_model()
fields = UserCreationForm.Meta.fields + ('email',)
# accounts/views.py
from .forms import CustomUserChangeForm, CustomUserCreationForm
def signup(request):
if request.user.is_authenticated:
return redirect('articles:index')
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
auth_login(request, user)
return redirect('articles:index')
else:
form = CustomUserCreationForm()
context = {
'form': form,
}
return render(request, 'accounts/signup.html', context)
'Web > Django' 카테고리의 다른 글
django_09_model_relationship (0) | 2021.04.01 |
---|---|
django_08_model_relationship (0) | 2021.03.29 |
django_06_model_relationship (0) | 2021.03.24 |
django_05_auth (0) | 2021.03.23 |
django_04_static_media_files (0) | 2021.03.18 |