2012-02-08 12 views
4

ここで何が起こっているのか本当に分かりません。 Django 1.3。Django auth failure

症状:認証は単に破棄されます。私はこの問題を軽減しました:

./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を使用しています。

編集2:

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

編集3:

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にアクセスするための壊れている理由として謎を残します。パスワードが正しいかどうかにかかわらず、「正しいユーザー名とパスワードを入力してください。両方のフィールドで大文字と小文字が区別されることに注意してください。

+0

どのバージョンにログインできないのですか? –

+0

私は1.3を実行しています。 – jal

+0

パスワードを設定して正しく保存したので、Django管理者ログインは新しいパスワードで動作しますか? – Alasdair

答えて

4

Django querysets are lazyが原因でこの問題が発生しています。 users[0]にアクセスするたびに、Djangoは別のオブジェクトを返します。これを実証するために

、以下を試してみてください。

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

あなたがオブジェクトIDが毎回異なっていることがわかります。保存するオブジェクトは、パスワードを設定したオブジェクトと同じではありません。新しいパスワードがデータベースに保存されていないため、認証に失敗します。

この問題を回避するには、assign users [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という値が入ります。あなたが問題を引き起こす可能性が何か他のものにそれを設定している場合

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

:あなたはそれがデフォルトになりますよう、ごsettings.pyでそれを定義する必要はありません。

+0

申し訳ありませんが、フォーマットの問題です。ユーザーの応答は[]です。はい、パスワードが「何でも」のユーザーは「jal」です。私はそれを新しくしました、そして、それはこのDBの唯一のユーザーです。 – jal

+0

ああ、私は今フォーマットを修正しました。あなたは 'pre'ブロックを必要としません - コードブロックのために4つのスペースをインデントします。 – Alasdair

+0

2つの応答として、AUTHENTICATION_BACKENDS =( 'django.contrib.auth.backends.ModelBackend'、 )また、書式設定のヒントに感謝します。 – jal

1

使用が有効であることを確認しましたか? (User.is_active)

非アクティブなユーザーには権限を持っていないし、(あなたは、物事をカスタマイズしていない限り)ジャンゴの