장고 - Email 로그인 기능 추가
- 장고는 기본적으로 username으로 로그인하는 기능 제공
- username, email 둘 중 하나로 로그인 하도록 커스터마이징 필요
- 커스텀 모델 백엔드를 추가하여 email, username 로그인 기능 추가 가능
- 로그인 기능 제어하는 것은 AUTHENTICATION_BACKENDS에 설정된 모델 백엔드를 통해 이루어진다.
Email 로그인 기능 추가 방법
account 앱에 backends.py 파일 추가하고 코드 입력
- 경로 : account > backends.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
class CustomUserBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
user = super().authenticate(request, username, password, **kwargs)
if user:
return user
# id 로그인 실패 상황
# e-mail 로그인 시도
UserModel = get_user_model()
# 원래 id 로그인 처리를 할 때 username이 넘어왔을 경우
email = username
if username is None:
email = kwargs.get(UserModel.EMAIL_FIELD, kwargs.get('email'))
try:
user = UserModel._default_manager.get(email=email)
except UserModel.DoesNotExist:
UserModel().set_password(password)
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user
- 경로 : account > backends.py
새로 만든 백엔드 클래스를 기본 인증 백엔드 클래스로 추가
- 경로 : config > settings.py
1
2
3AUTHENTICATION_BACKENDS = [
'account.backends.CustomUserBackend',
]
- 경로 : config > settings.py
Additional
유저 모델을 코드에서 참고하는 3가지 방법
- from django.contrib.auth.models import User
- from django.contrib.auth import get_user_model
- from django.conf import settings // settings.AUTH_USER_MODEL
- 1번이 가장 간단하고 보편적인 방법이나 커스텀 유저모델에 대응 못한다는 단점이 있다.
- 2, 3번을 많이 사용하나, 문제 없는 코드를 위해 3번을 주로 사용한다.
백엔드에서는 아래와 같은 메서드를 사용하여 권한 체크
- has_perm : 사용자가 활성화 상태이고 권한이 있는지 체크
- has_module_pers : 특정 앱의 사용권한이 있는지 체크
- get_all_permissions : 해당 사용자가 가진 모든 권한 목록 반환
- get_group_permissions : 해당 사용자가 속한 그룹의 권한 목록 반환
- get_user_permissions : 해당 사용자가 가진 권한 목록 반환
Posted