Django 커스텀 인증 시스템 구축

GisangLee·2022년 2월 24일
1

my_module

목록 보기
5/33
post-custom-banner

왜 커스텀 인증 시스템을 만들까

  • 우리의 서비스는 항상 동일 할 수 없다.
  • 서비스 입 맛에 맞는 인증 시스템이 필요하다.

그럼 어떻게 만드느냐

예를 들어 로그인 방식을 Email과 username 둘 다 사용하고 싶다고 가정하자.
요새 대부분 서비스는 로그인 방식을 다양하게 지원한다.

Ex) 카카오톡은 이메일, 유저 네임, 핸드폰 번호 등 다양하게 로그인 가능

  • myAuth.py
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
from . import models as user_models

# 이메일 + 유저 ID 둘다 로그인 되도록 하는 커스텀 인증 시스템 구축
class EmailUsernameLoginBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None):
        if '@' in username:
            kwargs = {
                "email": username
            }
        else:
            kwargs = {
                "username": username
            }
        try:
            user = get_user_model().objects.get(**kwargs)

            if user.check_password(password):
                user.is_wrong_pwd = False
                user.login_try = 0
                user.save()
                return user
                
            else:
                # 비밀번호 오류 시 로그인 시도 횟수 증가
                user.login_try = user.login_try + 1
                user.is_wrong_pwd = True
                user.save()
                return user

        except user_models.User.DoesNotExist:
            return None

    def get_user(self, username):
        try:
            return get_user_model().objects.get(pk=username)
        except get_user_model().DoesNotExist:
            return None
  • settings.py

    내가 만든 인증 시스템을 먼저 사용하도록 하자.
    커스텀 인증 시스템으로 인증이 안되면 Django 자체 백엔드 인증 시스템으로 인증하게 된다.

# Authentication Customizing
AUTHENTICATION_BACKENDS = (
    'accounts.login_auth.EmailUsernameLoginBackend',
    'django.contrib.auth.backends.ModelBackend',
)
  • 인증 시스템 호출
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)

아주 간단하구만

profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/
post-custom-banner

0개의 댓글