Django auth失败

时间:2012-02-08 19:08:16

标签: django authentication

我真的很想念这里发生的事情。 Django 1.3。

症状:身份验证简单地被破坏。我把问题减少到了这个:

./manage.py shell
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>from django.contrib.auth.models import User
>>> users = User.objects.all()
>>> users
[<User: jal>]
>>> users[0].set_password('whatever');
>>> users[0].save()
>>> user = auth.authenticate(username="jal", password="whatever")
>>> print user
None

我对此感到茫然。

编辑:

>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username="jal")
>>> print user
jal
>>> user.check_password('whatever')
False

我正在使用django.contrib.auth.backends.ModelBackend。

编辑二:

>>> print user
jal
>>> print user.is_active
True

编辑三:

Alasdair是对的 - 谢谢。

>>> users = User.objects.all()
>>> user = users[0]
>>> user.set_password('whatever')
>>> user.save()
>>> u2 = auth.authenticate(username="jal",  password="whatever")
>>> print u2
jal

这仍然为实际访问Django管理GUI而破坏了原因,这就是为什么我首先要走这条路。它给了我“请输入正确的用户名和密码。请注意,无论密码是否正确,这两个字段都区分大小写。”

2 个答案:

答案 0 :(得分:4)

您遇到此问题是因为Django querysets are lazy。每次访问users[0]时,Django都会返回一个不同的对象。

为了证明这一点,请尝试以下方法:

>>> users = User.objects.all()
>>> print id(users[0])
58753692
>>> print id(users[0])
58753111

您可以看到每次对象ID都不同。您保存的对象与您为其设置密码的对象不同。新密码尚未保存到数据库,因此身份验证失败。

要解决此问题,您可以将用户[0]分配给变量,或者用户list()强制对查询集进行评估。

# Assign users[0] to a variable.    
users = User.objects.all()
user = users[0]
user.set_password('whatever')
user.save()


# Force the queryset to be evaluated by using list()
users = list(User.objects.all())
users[0].set_password('whatever')
users[0].save()

修改:此建议不是问题,但可能有助于其他人。

设置文件中AUTHENTICATION_BACKENDS的值是多少?您无需在settings.py中对其进行定义,因为它默认为:

AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', ) 

如果您将其设置为其他内容,则可能会导致问题。

答案 1 :(得分:1)

您是否检查过该用途是否有效? (User.is_active)

非活动用户没有权限且无法登录(除非您自定义内容)