В предыдущей статье я подробно описал как можно заменить дефолтную модель пользователя 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 коммент.:
Отправить комментарий