воскресенье, 13 марта 2016 г.

Вход в систему по полям username или email

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

Отправить комментарий

Ярлыки

Популярные записи