Различные виды входа в систему с Custom User - PullRequest
0 голосов
/ 13 апреля 2020

Моя цель состоит в том, чтобы иметь два представления для входа в систему: одно с электронной почтой и паролем, а другое с именем пользователя и паролем.

Создан пользовательский класс пользователя с именем MyUser, расширяющийся из AbstractBaseUser. В этом пользовательском классе staboted

USERNAME_FIELD = 'email'

Django по умолчанию использует поле имени пользователя для целей аутентификации пользователя.

Когда я хочу, чтобы пользователи входили с электронной почтой, теперь это просто. Но как я могу создать другое представление, в которое входят только имя пользователя и пароль (вместо адреса электронной почты)?

1 Ответ

1 голос
/ 13 апреля 2020

Я делаю это, добавляя другой сервер аутентификации, используя AUTHENTICATION_BACKENDS . Или вы можете написать свой собственный бэкэнд аутентификации, принимая либо адрес электронной почты, либо имя пользователя.

Вот простая версия бэкенда аутентификации электронной почты. Обратите внимание, что для этого требуется, чтобы адреса электронной почты были уникальными в вашей базе данных, а не складывался регистр.

class EmailAuthBackend(ModelBackend):
    """
    Email Authentication Backend

    Allows a user to sign in using an email/password pair rather than
    a username/password pair.
    """

    def authenticate(self, request, email=None, password=None, **kwargs):
        """ Authenticate a user based on email address as the user name. """
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a nonexistent user (#20760).
            User().set_password(password)
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...