为什么authenticate()为非活动用户返回None?

时间:2018-03-29 10:16:56

标签: django authentication login django-custom-user

我有以下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 个答案:

答案 0 :(得分:1)

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

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

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

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

有关详细信息,请参阅is_active文档