Web/Django

django_07_custom_authentication

5_ssssseung 2021. 3. 25. 21:10

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를 나타내는데 사용하는 모델
  • 주의 사항
    • 프로젝트를 진행하는 동안 (즉, 프로젝트에 의존하는 모델을 만들고 마이그레이션 한 후) 설정은 변경할 수 없다. (변경하려면 큰 노력이 필요)
    • 프로젝트 시작 시 설정하기 위한 것이며, 참조하는 모델은 첫번째 마이그레이션에서 사용할 수 있어야 함

데이터베이스 초기화 후 마이그레이션 (프로젝트 중간이라면)

  1. migrations 파일 삭제
  2. db.sqlite3 삭제
  3. 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

Picture1
  • AbstractBaseUser
    • password 와 last_login 만 기본적으로 제공
    • 자유도가 높지만 필요한 필드는 모두 작성해야 함
  • AbstractUser
    • 관리자 권한과 함께 완전한 기능을 갖춘 사용자 모델을 구현하는 기본 클래스

Custom user and built-in auth forms

https://docs.djangoproject.com/ko/3.1/topics/auth/customizing/#custom-users-and-the-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