В предыдущей статье я подробно описал как можно заменить дефолтную модель пользователя django.contrib.auth.models.User
своей собственной. Делали мы это для того чтобы изменить встроенное (из коробки) поведение фреймворка.
В этой статье, я хочу описать процесс реализации варианта использования, когда вход в систему пользователь может осуществить по одному из полей username
, или email
. Делается это очень просто — определением кастомного бэкенда аутентификации.
Следует отметить, что такого рода аутентификация возможна только в том случае, если username
или email
однозначно идентифицируют одного пользователя системы. Дефолтное (из коробки) поведение Django не разрешает этого добится, поскольку, в модели django.contrib.auth.models.User
поле email
не объявленно уникальным. Для реализации такой аутентификации, сперва необходимо заменить модель пользователя. Как это сделать описано в предыдущей статье.
Итак, допустим, мы имеем в проекте приложение под названием security
. В нем создадим файл auth_backends.py
в котором мы разместим наш бэкенд UsernameEmailAuthenticateBackend
:
from django.contrib.auth.backends import ModelBackend from django.contrib.auth import get_user_model from django.db.models import Q class UsernameEmailAuthenticateBackend(ModelBackend): def __init__(self): self.UserModel = get_user_model() def authenticate(self, username=None, password=None, **kwargs): try: user = self.UserModel.objects.get(Q(username=username) | Q(email=username)) if password is not None: if user.check_password(password): return user else: return user except self.UserModel.DoesNotExist: return None def get_user(self, user_id): try: return self.UserModel.objects.get(pk=user_id) except self.UserModel.DoesNotExist: return NoneКак только мы реализуем этот бэкенд, настроим проект на его использование. Для этого, в файле
settings.py
определим кортеж AUTHENTICATION_BACKENDS
таким образом:
... AUTHENTICATION_BACKENDS = ( 'security.auth_backends.UsernameEmailAuthenticateBackend', ) ...
Это все. Теперь, Django будет использовать наш бэкенд для аутентификации пользователя.
0 коммент.:
Отправить комментарий