无法通过使用带有用户名和密码的过滤器来获取用户

时间:2018-09-27 06:18:57

标签: django django-models django-admin django-users

我正在使用以下代码

email = validated_data["login"]
password = validated_data["password"]
user_obj = User.objects.filter(Q(email__exact=email) & Q(password__exact=password))

我从admin更改了密码,但是没有用户返回。但是,如果删除密码检查,则会返回一个用户对象。如果删除Q(password__exact=password)条件,则返回的对象的_password字段为None。这段代码已经运行了一段时间,但是今天它并没有返回该对象。我在这里想念什么吗?我确认我从客户端收到了正确的用户名和密码。我还尝试使用该用户名和密码(该帐户具有工作人员身份)访问管理员,并且能够登录。因此密码正确,但是由于某些原因我无法通过过滤获取该用户。 ?我可能做错了什么?

2 个答案:

答案 0 :(得分:1)

password不会以纯文本形式存储,而是以散列(还有更多)存储。通过用户名获取用户并检查密码:

# assumes there can be only one
user = User.objects.get(email=email) 
# this checks the plaintext password against the stored hash 
correct = user.check_password(password)  

顺便说一句,逻辑Q不需要AND对象。在这种情况下,即使filter(email__exact=email, password__exact=password)没什么意义,也足够。

答案 1 :(得分:0)

这是因为Django不会将密码存储为散列的简单文本,因此您无法执行密码__确切地说,除非您在此处获得相同的散列password = validated_data["password"],否则每次都不会返回密码