supermouse1

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版本

 

posted on 2020-04-30 13:02  supermouse1  阅读(494)  评论(0编辑  收藏  举报

导航