【问题标题】:Why authenticate() return None for inactive users?为什么 authenticate() 为非活动用户返回 None?
【发布时间】:2018-09-08 06:15:14
【问题描述】:

我有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 但没有找到适合我情况的答案

【问题讨论】:

    标签: django authentication login django-custom-user


    【解决方案1】:

    首先,请注意 Django 带有 login viewauthentication form,它们会在非活动用户尝试登录时显示适当的错误消息。如果您使用它们,那么您可能不必更改 @987654324 的行为@。

    从 Django 1.10 开始,默认的ModelBackend 身份验证后端不允许使用is_active = False 的用户登录。

    如果您想允许非活动用户登录,那么您可以使用AllowAllUsersModelBackend 后端。

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

    有关更多信息,请参阅is_active 文档,

    【讨论】:

    • 很高兴它可以工作,但更改AUTHENTICATION_BACKENDS 可能是不必要的。使用内置的登录视图和表单可能是更好的方法。
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2015-06-18
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多