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函数

扫描二维码关注公众号,回复: 11156899 查看本文章

  

  

 

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

解决方案:

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

方案2:升级django版本

猜你喜欢

转载自www.cnblogs.com/blogsupermouse/p/12808228.html