[Django] - Custom User Model Using AbstractUser

KimJiHong·2023년 10월 6일
1

Django and API

목록 보기
2/9
post-thumbnail

Authentication & Authorization

Djanog 는 내장된 모듈을 사용하여 빠르게 웹 프레임워크를 구축할 수 있는 것이 장점이다.

장고의 내장 모듈인 Authentication & Authorization system 도 각각 사용자 인증과 인증된 사용자에게 권한을 부여해주는 역할을 해준다.

Authentication (인증) : 사용자의 신원을 검증
Authorization (인가) : 인증된 사용자에게 특정 기능에 액세스할 수 있는 권한을 부여

또, 이러한 내장 모듈을 사용하여 개발자는 로그인 페이지를 구현하고, 각 페이지에서 로그인된 사용자가 이용할 수 있는 서비스를 빠르게 구현할 수 있다.

자세한 내용은 Django Authentication System Document 에서 확인할 수 있다.


Django User & AbstractUser

장고에서는 사용자를 인증 및 인가를 위한 정보를 저장하는 기본 모델 User 가 내장되어 있다.
하지만, User 모델에는 기본적인 사용자 정보를 저장하기 위한 fields만 가지고 있어 내가 원하는 fields 를 넣기 위해서는 AbstractUser 를 사용하여 데이터베이스를 커스터마이징 해야한다.

User model 기본 fields

  • id : 사용자의 고유 식별자
  • password : 사용자의 로그인 PASSWORD
  • last_login : 사용자의 마지막 로그인 시간
  • is_superuser : 관리자 권한이 있는 사용자인지에 대한 여부
  • username : 사용자의 로그인 ID
  • first_name : 사용자의 이름
  • last_name : 사용자의 성
  • email : 사용자의 이메일
  • is_staff : 사용자가 스태프 권한을 가지는지에 대한 여부
  • is_active : 사용자 계정이 활정화 되었는지에 대한 여부
  • data_joined : 사용자가 가입한 날짜
  • groups : 사용자가 속한 그룹을 관리할 수 있는 필드
  • user_permissions : 사용자에게 부여된 권한을 관리하는 필드

Using AbstractUser for customizing User model

User 모델을 커스텀하기 위해서, models.py 에서 AbstractUser 모듈을 사용하여 User model 을 상속받아 새로운 모델을 생성해야한다.
그리고 새로 생성한 모델에 내가 원하는 fields 를 정의하면 된다.
(장고 모델의 필드에 어떤 종류를 추가할 수 있는지 볼려면 이 블로그에서 확인 해보길 바란다.)

나는 room_name 이라는 정보를 추가했다.

# users/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

# 'UserDB' 라는 새로운 모델에 장고 기본 User 모델을 상속받았다.
class UserDB(AbstractUser):
	# add room_name fields
	room_name = models.CharField(max_length=50)
    
# 생성후 마이그레이션 적용 잊지 말자!
# 마이그레이션 적용법은 '모델과 폼' 게시글에서 볼 수 있다.

우리는 장고 기본 User 모델을 상속받아 UserDB 라는 새로운 모델을 생성했고, room_name 이라는 필드도 추가했다.

하지만 아직 장고는 사용자 인증과 인증을 위해 사용되는 데이터베이스가 UserDB 모델인지 User 모델인지 모른다.
따라서 이렇게 새로운 모델을 생성하고 바로 해당 모델로 로그인 페이지를 구현하게 된다면 Swap error 가 발생한다.

Swapped User Model

새로 생성한 UserDB 모델을 장고의 기본 User 모델로 사용하기 위해서는 settings.py 에서 정의해줘야 한다.
또, admin 페이지에서 데이터베이스를 관리하기 위해서는 새로 생성된 모델을 연결해야 한다.

# mysite/setting.py

# 어떤 DB를 main User DB로 사용할 것인지 꼭! 정의해야 한다.
# AUTH_USER_MODEL = '{MyAppName}.{ModelName}'
AUTH_USER_MODEL = 'users.UserDB'
# user/admin.py

# admin 페이지와 새로 생성된 모델간의 연결

from django.contrib import admin
# models.py 에서 정의한 UserDB를 가져오기
from .models import UserDB

# UserDB 연동
admin.site.register(UserDB)

Test

이제, 실제로 모델이 잘 적용되었는지 admin 페이지와 db에서 확인해보자.
먼저 admin 이라는 super user를 생성해주었다.

'admin' 아이디가 UserDB 내에 정상적으로 저장이 됐는지 SQlite3 프로그램에서 확인해보고 'room_name' 이 추가된 UserDB가 admin 페이지에 연결 되었는지 확인해보자.

오류없이 모두 정상적으로 작동되는 걸 볼 수 있다.




틀린 부분이 있다면 지적 정말 감사합니다. 바로바로 수정하겠습니다.
profile
대충 할거면 시작도 하지 말자

0개의 댓글