Почему authentication() возвращает None для неактивных пользователей?

У меня есть CustomUser вроде следующего:

        class CustomUser(AbstractBaseUser, PermissionsMixin):
            email = models.EmailField(max_length=100, unique=True)
            username = models.CharField(max_length=20, unique=True)
            is_active = models.BooleanField(default=False)
            is_staff = models.BooleanField(default=False)
            ...

который равен active default=False После регистрации пользователя автоматически обрабатывается UserLogin def, который равен:

        def UserLogin(request):
            if request.POST:
                username = request.POST['username']
                user = authenticate(username=username, password=request.POST['password'])
                print('user :', user)  # which is print None if user inactive 
                if user is not None:
                    print('is user active:', user.is_active)   # should print True or False  
                    if user.is_active:
                        login(request, user)
                        ... 
                    else:  # handle user inactive
                        ...
                else:  # for None user 
                   ...

Я все еще пытаюсь понять, почему authenticate возвращает None для неактивных пользователей?

После поиска я нашел более улыбчивую проблему возвращает False для неактивных пользователей в шаблоне Но не нашел ответа для моей ситуации


person dan    schedule 29.03.2018    source источник


Ответы (1)


Во-первых, обратите внимание, что Django поставляется с вид входа и форма аутентификации, которая отображает подходящие сообщения об ошибках, когда неактивные пользователи пытаются войти в систему. Если вы их используете, вам, вероятно, не нужно менять поведение для authenticate().

Начиная с Django 1.10, серверная часть аутентификации ModelBackend по умолчанию не позволяет пользователям с is_active = False входить в систему.

Если вы хотите разрешить неактивным пользователям входить в систему, вы можете использовать бэкэнд AllowAllUsersModelBackend.

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']

См. is_active документы для получения дополнительной информации,

person Alasdair    schedule 29.03.2018
comment
Рад, что это работает, но изменение AUTHENTICATION_BACKENDS может быть ненужным. Использование встроенного представления входа и формы, вероятно, является лучшим подходом. - person Alasdair; 29.03.2018