728x90
홈페이지를 구성하며 CRUD를 다루는 방법을 배웠는데, 보통 일반인이 들어가서 CRUD를 하기 위해서는 회원가입의 절차가 필요하다.
우리는 관리자로서 인증된 User에게 권한을 부여하여 우리의 서비스를 이용하게 해준다.
목차
- authentication system
- Substituting a custom User model
- 과정
- db 초기화
1. authentication system
- 인증(Autentication)과 권한(Authorization) 부여를 함께 제공(처리)하며, 이러한 기능을 일반적으로 인증 시스템이라고 함
- 필수 구성은 settings.py에 이미 포함되어 있으며 INSTALLED_APPS에서 확인 가능
- django.contrib.auth
- Authentication(인증)
- 신원 확인
- 사용자가 '누구'인지 확인
- Authorization(권한, 허가)
- 권한 부여
- 인증된 사용자가 수행할 수 있는 작업 결정
# 사전 설정
1. 두 번째 앱으로 app-accounts 생성 및 등록
여기서 app name을 다른 이름으로 해도 되지만,
- auth와 관련한 경로나 키워드들을 Django 내부적으로 accounts라는 이름으로 사용하고 있기 때문에 되도록 accounts로 지정하는 것을 권장
2. url 분리 및 매핑
2. Substituting a custom User model
- 말 그대로 custom user model로 대체하기
- Django는 기본적인 인증 시스템과 여러 가지 필드가 포함된 User Model을 제공
- 대부분의 개발 환경에서 기본 User Model을 Custom User Model로 대체함
- 개발자들이 작성하는 일부 프로젝트에서는 django에서 제공하는 built-in User model의 기본 인증 요구사항이 적절하지 않을 수 있음
- 예 - 내 서비스에서 회원가입 시 username보다 email을 식별 값으로 사용하는 것이 적합한 경우, Django의 User Model은 기본적으로 username를 식별 값으로 사용하기 때문에 적절하지 않다.
- Django는 현재 프로젝트에서 사용할 User Model을 결정하는 AUTH_USER_MODEL 설정 값으로 Default User Modle을 재정의(override) 할 수 있도록 함
AUTH_USER_MODEL
- 프로젝트에서 User를 나타낼 때 사용하는 모델
- 중요!! 프로젝트가 진행되는 동안 (모델을 만들고 마이그레이션 한 후) 변경할 수 없음
- 프로젝트 시작 시 설정하기 위한 것이며, 참조하는 모델은 첫 번째 마이그레이션에서 사용할 수 있어야 한다.
- 즉, 첫 번째 마이그레이션 전에 확정 지어야 하는 값
- 기본 값
# 참고
AUTH_USER_MODEL은 settings.py에 보이지 않을 텐데 어디에 있는 것일까?
- 우리가 작성하는 settings.py는 사실 global_settings.py를 상속받아 재정의하는 파일
과정
- 대체하는 과정 외우기 어렵다면 해당 공식문서 보면서 순서대로 진행
- https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#substituting-a-custom-user-model
1. AbstractUser를 상속받는 커스텀 User 클래스 작성
- 기존 User 클래스도 AbstractUser를 상속받기 때문에 커스텀 User 클래스도 완전히 같은 모습을 가진다.
2. Django 프로젝트에서 User를 나타내는 데 사용하는 모델을 방금 생성한 커스텀 User 모델로 지정
3. admin.py에 커스텀 User 모델을 등록
- 기본 User 모델이 아니기 때문에 등록하지 않으면 admin site에 출력되지 않음
# 참고
- User 모델 상속 관계
- AbstractUser
- 관리자 권한과 함께 완전한 기능을 가지고 있는 User model을 구현하는 추상 기본 클래스
- Abstract base classes(추상 기본 클래스)
- 몇 가지 공통 정보를 여러 다른 모델에 넣을 때 사용하는 클래스
- 데이터베이스 테이블을 만드는 데 사용되지 않으며, 대신 다른 모델의 기본 클래스로 사용되는 경우 해당 필드가 하위 클래스의 필드에 추가
# 주의 - 프로젝트 중간에 AUTH_USER_MODEL 변경하기
- 모델 관계에 영향 미치기 때문에 훨씬 더 어려운 작업 필요
- 예 - 변경사항이 자동 수행 X -> DB 스키마를 직접 수정하고, 이전 사용자 테이블에서 데이터를 이동하고, 일부 마이그레이션을 수동으로 다시 적용 등등..
- 결론 - 중간 변경은 권장하지 않는다! 반드시 프로젝트 처음에 진행하자
데이터베이스 초기화
프로젝트가 진행 중인 경우 데이터베이스 초기화하는 방법
- migrations 파일 삭제
- migrations 폴더 및 __init__.py는 삭제 XXXXXX
- 번호가 붙은 파일만 삭제
- db.sqlite3 삭제
- migrations 진행
- makemigrations
- migrate
- custom User로 변경된 테이블 확인
- 이제 auth_user 테이블이 아니라 accounts_user 테이블을 사용
반드시 User 모델을 대체해야 할까??
- Django는 새 프로젝트를 시작하는 경우 비록 기본 User모델이 충분하더라도 커스텀 User 모델 설정하는 것을 강력하게 권장(highly recommended)
- 커스텀 User 모델은 기본 User 모델과 동일하게 작동 하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문
- 단, User 모델 대체 작업은 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 함
728x90
'Back-end > Django' 카테고리의 다른 글
[Django] Authentication in Web requests (0) | 2022.09.19 |
---|---|
[Django] HTTP Cookies (0) | 2022.09.19 |
[Django] Allowed HTTP methods (0) | 2022.09.06 |
[Django] Handling HTTP requests (0) | 2022.09.06 |
[Django] ModelForm (0) | 2022.09.06 |