장고 - Email 로그인 기능 추가

  • 장고는 기본적으로 username으로 로그인하는 기능 제공
  • username, email 둘 중 하나로 로그인 하도록 커스터마이징 필요
  • 커스텀 모델 백엔드를 추가하여 email, username 로그인 기능 추가 가능
  • 로그인 기능 제어하는 것은 AUTHENTICATION_BACKENDS에 설정된 모델 백엔드를 통해 이루어진다.

Email 로그인 기능 추가 방법

  1. 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
      26
      from 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
  2. 새로 만든 백엔드 클래스를 기본 인증 백엔드 클래스로 추가

    • 경로 : config > settings.py
      1
      2
      3
      AUTHENTICATION_BACKENDS = [
      'account.backends.CustomUserBackend',
      ]

Additional

  • 유저 모델을 코드에서 참고하는 3가지 방법

    1. from django.contrib.auth.models import User
    2. from django.contrib.auth import get_user_model
    3. 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 : 해당 사용자가 가진 권한 목록 반환