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认证错误问题的主要内容,如果未能解决你的问题,请参考以下文章
如何添加Authenticate Middleware JWT django?
双因素认证(two-factor authentication)