为什么对于未激活的用户,authenticate() 返回 None?

9
我有一个名为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
经过搜索,我发现了类似的问题:user.is_authenticated always returns False for inactive users on template,但没有找到适用于我的情况的答案。
1个回答

13

首先,注意Django附带了一个登录视图身份验证表单,当非活动用户尝试登录时会显示适当的错误消息。如果您使用它们,则可能不必更改authenticate()的行为。

自Django 1.10以来,默认的ModelBackend身份验证后端不允许具有is_active=False的用户登录。

如果要允许非活动用户登录,则可以使用AllowAllUsersModelBackend后端。

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

请查看is_active文档以获取更多信息。


很高兴它能够工作,但更改AUTHENTICATION_BACKENDS可能是不必要的。使用内置的登录视图和表单可能是更好的方法。 - Alasdair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接