0. 진행사항
2024.07.06 - [Django] - [Django] Django와 PostgreSQL 연동
Django 와 PostgreSQL을 연동해 주었고, 오늘은 사용자(USER)를 저장하는 데이터베이스를 만들어보고자 한다.
여태까지 장고의 기본 유저 모델을 사용하지 않고, 직접 모델을 만드는 방식으로 프로젝트를 진행했었다.
아래 코드처럼 models.Model 을 이용했다.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
birth_date = models.DateField()
def __str__(self):
return f"{self.first_name} {self.last_name}"
- models.Model 클래스는 Django의 ORM(Object-Relational Mapping) 시스템의 핵심 요소로, 데이터베이스 테이블을 Python 클래스처럼 다룰 수 있게 해준다. models.Model을 상속받아 클래스를 정의하면, Django는 자동으로 데이터베이스 테이블을 생성하고 관리할 수 있도록 도와준다.
1. Django의 User Model (기본 인증 모델)
- 이렇게 직접 모델을 만들지 않고, 기존에 제공하는 모델을 사용할 수 있는데 오늘 사용해 볼 것은 User Model 이다.
- 기본 User Model 은 인증 및 권한 부여 기능을 포함하여 웹 어플리케이션에서 사용자 계정 관련 작업을 쉽게 처리할 수 있다.
a. 기본 User 모델
- 기본 User 모델을 사용하기 위해서는 django.contrib.auth 앱을 설치해야 한다.
(하지만 일반적으로 INSTALLED_APPS 에 기본적으로 포함되어 있다.)
- Django의 기본 User 모델은 django.contrib.auth.models 모듈에서 제공된다. 회원 관리 기능 및 여러 인증을 구현할 수 있다.
- auth_user 테이블을 보면 아래와 같이 구성된 것을 확인할 수 있다.
- 위 그림에서 보면 알 수 있듯이, 이 모델은 아래의 필드를 기본적으로 제공한다.
- username
- 필수값! 150자 이하의 영숫자, _, @, +, ., -를 포함할 수 있다.
- max_length는 여러 케이스에 대해 충분해야 한다.
- first_name
- 선택값(blank=True). 150자 이하
- last_name
- 선택값(blank=True). 150자 이하
- email
- 선택값(blank=True). 이메일 주소
- password
- 필수값! password에 대한 해시값과 메타데이터값
- Django는 원래 암호를 그대로 저장하지 않는다.
- groups
- 그룹에 대한 필드
- user_permissions
- 유저의 권한을 설정하는 필드
- is_staff
- Boolean 타입. 이 사용자가 관리자 사이트에 접근할 수 있는지 지정한다.
- True이면 접근 가능
- is_active
- Boolean 타입. 이 사용자 계정을 활성으로 간주 할지를 지정한다.
- 계정을 삭제하는 대신, 이 flag를 False 지정하는 것을 권장한다. (응용 프로그램에 사용자에 대한 외래키가 있는 경우 외래 키가 손상되지 않기 때문이다)
- is_superuser
- Boolean 타입. 이 사용자에게 명시적으로 할당하지 않고, 모든 권한이 있음을 지정한다.
- last_login
- 사용자의 마지막 로그인 날짜/시간 (datetime)
- date_joined
- 계정이 만들어진 날짜/시간 (datetime)
- 계정 생성 시 기본적으로 현재 날짜/시간으로 설정된다.
2. Django의 User Model 커스터마이징
엇 근데 password는 User 모델에 있는데 department, employ_id 라는 필드가 없다..😨
이런 경우에는 어떻게 해야 할까?🙄
위의 경우처럼, User 모델이 충분하지 않다면 사용자 모델을 커스터마이징 할 수 있는 방법이 있다.
AbstractUser 또는 AbstractBaseUser 를 상속받아 사용자 모델을 정의할 수 있다.
a. AbstractUser
Django의 기본 User 모델의 동작은 그대로 하고, 필드만 재정의할 때 사용하는 방식이다.
AbstractUser 클래스는 AbstractBaseUser 클래스와 PermissionMixin 클래스를 상속받아 생성된다.
관리자 호환 권한이 있는 완전한 기능을 가진 User 모델을 구현하는 추상 기본 클래스이다.
사용자 이름과 암호가 필요하다. 다른 필드는 선택 사항이다.
해당 클래스는 username, first_name, last_name, email, is_staff, is_active, date_joined 필드를 정의하고 있다.
[AbstractUser 상속]
즉, AbstractUser 클래스를 상속 받으면 장고 유저 모델의 기존 필드와 권한 등을 모두 사용하면서 필요한 필드를 추가할 수 있다.
유저 모델을 커스텀하는 가장 빠르고 간단한 방법이라고 할 수 있다.
b. AbstractUser 구현 방법
1. models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
bio = models.TextField(null=True, blank=True)
birth_date = models.DateField(null=True, blank=True)
def __str__(self):
return self.username
이렇게 기존 user 모델에는 없는 필요한 필드를 추가하여 모델을 만든다.
2. settings. py
AUTH_USER_MODEL = 'myapp.CustomUser'
그리고 설정 파일에서 기본 사용자 모델을 커스텀 모델로 변경해준다.
3. admin. py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(CustomUser)
필요에 따라 app 모델도 등록하면 된다.
c. AbstractBaseUser
AbstractBaseUser 클래스는 Django의 사용자 인증 시스템을 완전히 커스터마이징할 때 사용되는 추상 클래스이다.
AbstractBaseUser 를 상속받아 사용자 모델을 정의하면, 기본 제공되는 User 모델과 다르게 필요한 필드와 메서드를 자유롭게 정의할 수 있다.
[AbstractBaseUser 상속]
AbstractBaseUser 클래스를 상속 받으면 password, last_login, is_active 필드와 패스워드 관련 함수(해시 등)만 제공된다.
이렇게 커스텀 유저 모델을 만들면 최소한의 필드만 제공해주기에 자유도가 훨씬 높아진다.
다만, BaseUserManager를 상속 받는 새로운 클래스를 만들어줘야 하고 USERNAME_FIELD REQUIRED_FIELDS 등 필수적으로 정의해야할 내용이 존재한다.
'Django' 카테고리의 다른 글
[Django] Admin(어드민페이지) 커스터마이징 (0) | 2024.07.17 |
---|---|
[Django] Django와 PostgreSQL 연동 (0) | 2024.07.06 |
[Django] 가상환경 세팅 및 프로젝트 생성(Mac) (0) | 2024.07.05 |