代码之家  ›  专栏  ›  技术社区  ›  dan

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

  •  4
  • dan  · 技术社区  · 6 年前

    我有 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 回复  |  直到 6 年前
        1
  •  7
  •   Alasdair    6 年前

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

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

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

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

    请参见 is_active 文档了解更多信息,

    推荐文章