Django1.11自带authenticate认证错误问题

Posted blogsupermouse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django1.11自带authenticate认证错误问题相关的知识,希望对你有一定的参考价值。

问题描述:

  

 def post(self, request):
        """登陆校验"""
        username = request.POST.get(username)
        password = request.POST.get(pwd)
        if not all([username, password]):
            return render(request, login.html, {errmsg: 数据不完整})

        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                # 用户已激活
                login(request, user)
                return redirect(reverse(goods:index))
            else:
                # 用户未激活
                return render(request, login.html, {errmsg: 用户未激活})
        else:
            return render(request, login.html, {errmsg: 用户名或密码错误})

django1.11自带的authenticate模块验证用户,只要用户没激活,输入的用户名密码都是正确的也是返回None值

 

问题原因:

  通过查看django.contrib.auth.authenticate 源码

  技术图片

 

   django通过authenticate这个函数返回一个用户对象,这个用户对象是通过_authenticate_with_backend函数产生的

技术图片

 

 

  _authenticate_with_backend的返回值是调用django.contrib.auth.backends.ModelBackend模块的authenticate函数技术图片

 

 

  

 

 技术图片 

 技术图片

 从上面两个图可以看出authenticate函数需要同时满足密码正确和is_active=True,才能返回user对象,否则则返回None,所以django1.11自带的authenticate模块验证用户必须要用户名密码正确并且已经激活才能返回user对象,否则为None

 

解决方案:

方案1:去掉系统用户激活判断。

技术图片

 

 

方案2:升级django版本

 

以上是关于Django1.11自带authenticate认证错误问题的主要内容,如果未能解决你的问题,请参考以下文章

Django-自带的用户认证(auth)

如何添加Authenticate Middleware JWT django?

双因素认证(two-factor authentication)

Django自带的认证系统

HTTP Digest Authentication 使用心得

HTTP Digest Authentication 使用心得