2012-09-14 51 views
6

syncdbコマンドを使用しているユーザーを作成しましたが、完全にログインします。しかし、私は、Djangoの管理者からユーザーを作成するときに、それが正常に作成されますが、それをログイン時にエラーが発生し、私はエラーを取得:。django adminでユーザパスワードがハッシュされないのはなぜですか?

Unknown password hashing algorithm 'password'. Did you specify it in the PASSWORD_HASHERS setting? 

問題は何ですか?管理者にユーザーを保存する際にパスワードが自動的に暗号化されるように、どうすれば解決できますか?

答えて

0

Djangoはパスワードをプレーンテキストとして保存しません。最初にハッシュし、ハッシュを格納します。ユーザーがログインすると、Djangoはユーザーの入力に同じハッシュ関数を適用し、ユーザーの入力とdbに格納されているものの2つのハッシュを比較します。

しかし、柔軟性を高めるため、Djangoにはパスワードハッシュが格納されていませんが、ハッシュが生成されたアルゴリズムも格納されています。このシナリオを想像してみましょう。ハッシュ関数Xを使用してパスワードハッシュを生成しますが、その機能は何らかの理由で安全でなくなり、ハッシュ関数Yに切り替わります。しかし、ポイントで誰でもパスワードハッシュが関数Xを使用して保存されているため、もうログインできなくなるため、問題になります。そのため、Djangoはハッシュ値そのものに加えて、hasが生成されたメソッドも格納しています。これは、PASSWORD_HASHERSの設定が入っています。Djangoがハッシュを生成する方法をデータベースに格納しているので、値を読むとき、実際にDjangoにどのようにハッシュ関数を実行するかは分かりません。したがってPASSWORD_HASHERSは、ハッシングPython関数(実際にはクラスですが、とにかく...)とdbに格納された値との間のマッパーのようなものです。

質問に戻る。このエラーメッセージは、Djangoがデータベースのパスワードのハッシュを格納するために使用されたハッシュ関数passwordを認識していないこと、または少なくともPASSWORD_HASHERSに含まれていないことを認識していることを意味します。

私はそれが起こる可能性がある理由のカップルを考えることができます。

  • あなたがsyncdbを行うことを確認してください、それはあなたが管理者にアクセスするには、サーバーを実行しているときと同じsettings.pyファイルを使用しています。異なる設定が使用されている場合があります。

  • しかし、開発者は通常settings.pyPASSWORD_HASHERSを変更せず、デフォルト値を使用します。その場合は、syncdbを実行したときと、サーバを実行するときに、インストールされている同じバージョンのDjangoで同じPythonを使用していることを確認してください。たとえば、1つのvirtualenvでsyncdbを実行し、異なるenvでserverを実行すると、Djangoのバージョンは異なる可能性があります。したがって、PASSWORD_HASHERSの設定が異なる可能性があります。syncdbを実行すると、サーバーを実行するときに定義されます。

+0

あなたはhttps://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwordsでDjangoはパスワードを保存する方法についての詳細を読んだり、取得するには、ページ全体を読むことができますユーザー認証を含むDjango authの仕組みをよりよく理解する。 – miki725

4

私はそれのためのモデルの管理者を作成し、ユーザーを作成するために自動的に生成されたDjangoの管理フォームを使用し、その後、私はDjangoのユーザをサブクラス化していた状況で、同じ問題に遭遇しました。

は、だから、私は管理者でこれを私のmodels.py

class Employee(User): 
    job = models.CharField(max_length=100) 

にこのような何かを持っていました。PY

class EmployeeAdmin(admin.ModelAdmin): 
    pass 
admin.site.register(Employee, EmployeeAdmin) 

今Djangoは自動的にDjangoのadminに新しい従業員を追加するためのフォームを作成します。しかし、このフォームを使用してユーザーを作成すると、パスワードはハッシュされません。だから何らかの理由で、DjangoはDjangoに組み込まれたUserからモデルが派生したときにパスワードのための通常のテキスト入力フィールドを作成します。同じ事件があったかどうかわかりません。

残念ながら、私はこれを修正する簡単な解決策を見つけることができませんでした。また、Djangoがパスワードの正しいフォームフィールドを自動的に作成していない理由もわかりません。ただし、自動フォームをパスワード・ウィジェットを含むカスタム・フォームでオーバーライドすることも可能です。 https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overridesを参照してください。

+0

ModelAdminではなく、UserAdminを拡張する必要があります –

2

私はRubinous答えに示されている同じ問題を経験しましたが、あなたの問題かもしれません。

問題はdjango.contrib.admin.ModelAdminの代わりにこれを行うことにより、django.contrib.auth.admin.UserAdmin

から私のユーザモデルを継承する場合、テキストではなく、ハッシュされたパスワードとして格納されているパスワードを、私はnecesaryユーザー機能をバイパスした

2

ソリューションはUSERADMINを使用することですが起こりましたModelAdminではなくdjango.contrib.auth.adminから取得します。

from django.contrib.auth.admin import UserAdmin 

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin) 
関連する問題