본문 바로가기
Python/Django

Django 공식문서 읽기 - Customizing authentication in Django(4)

by 코드뭉치 2023. 5. 3.


Custom permissions
 맞춤 권한 설정을 위해 permissions 모델의 Meta 속성을 사용

class Task(models.Model):
    ...

    class Meta:
        permissions = [
            ("change_task_status", "Can change the status of tasks"),
            ("close_task", "Can remove a task by setting its status as closed"),
        ]

이것의 역할은 migrate를 할 때 추가적인 권한을 실행하는 것.

여기서 추가한 권한은  has_perm() 메소드를 통해 검사할 수 있다.

user.has_perm("app.close_task")



Extending the existing User model
 User 모델을 확장하는 방법 첫번째, 프록시 모델 참고하기
 두번째, OneToOneField로 참조하기

from django.contrib.auth.models import User

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.CharField(max_length=100)
u = User.objects.get(username="fsmith")
freds_department = u.employee.department


Substituting a custom User model
 Django는 맞춤 모델을 참조하는 AUTH_USER_MODEL 설정값을 제공.
기본 사용자 모델을 오버라이드 할 수 있다.
AUTH_USER_MODEL = "myapp.MyUser"

Using a custom user model when starting a project
기본 User모델 쓰지말고 이거쓰는걸 강력 추천

 from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

어드민 페이지 등록방법

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)


Changing to a custom user model mid-project
 프로젝트 중간에 AUTH_USER_MODEL을 변경하는 것은 매우 어려움. 

수동으로 스키마를 수정하고, 데이터를 이전해야한다. (하지말라)

 

Reusable apps and AUTH_USER_MODEL

재사용 가능한 앱은 맞춤 사용자 모델을 구현하면 안된다. 

사용자 모델이 구현된 재사용 가능한 앱은 두개가 동시에 사용이 불가능하기 때문에.

앱마다 사용자 정보를 저장해야 한다면? ForeignKey나 OneToOneField를 AUTH_USER_MODEL로 사용


Referencing the User model
 User를 직접 참조한다면 (Fk 등) AUTH_USER_MODEL 설정이 

다른 사용자 모델로 변경되었을 때 코드가 동작하지 않을 것
django.contrib.auth.get_user_model() 은 현재 사용중인 user model를 반환해준다. 

Specifying a custom user model
 기본 인증 백엔드를 사용한다면 model은 인증을 위한 unique field가 있어야한다.

(맞춤 인증 백엔드가 없다면)
custom user model을 만드는 가장 쉬운 방법은  AbstractBaseUser를 상속하는 것. 

이 추상 클래스는 해쉬 비밀번호, 토큰화된 재설정을 포함한다. 

class MyUser(AbstractBaseUser):
    identifier = models.CharField(max_length=40, unique=True)
    ...
    USERNAME_FIELD = "identifier"

여기서 identifier는 username이 될 수도, email이 될 수도 있다. Unique하기만 하면 OK

 

REQUIRED_FIELDS

createsuperuser를 사용해서 user를 만들 때 입력해야하는 필드 이름들 목록

 

is_active

계정의 활성화 여부, 디폴트 값으로 True가 제공됨.

세부 사항은 is_active attribute on the built-in user model 문서를 참조

 

댓글