8

コマンドを使用してユーザーを作成するsyncdbと、完全にログインします。しかし、django admin からユーザーを作成すると、正常に作成されますが、ログイン時にエラーが発生します。次のエラーが発生します。

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

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

4

4 に答える 4

5

パスワードがハッシュされたパスワードではなくテキストとして保存される場合の解決策は、ModelAdmin の代わりに django.contrib.auth.admin の UserAdmin を使用することです。

from django.contrib.auth.admin import UserAdmin

class EmployeeAdmin(UserAdmin):
    pass

admin.site.register(Employee, EmployeeAdmin)
于 2015-09-04T05:55:02.910 に答える
4

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

だから私は私のmodels.pyにこのようなものを持っていました

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

そしてこれは私のadmin.pyにあります

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

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

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

于 2012-10-10T10:11:33.077 に答える
1

Django はパスワードを平文で保存しません。最初にそれらをハッシュし、ハッシュを保存します。したがって、ユーザーがログインすると、Django は同じハッシュ関数をユーザーの入力に適用し、ユーザーの入力とデータベースに格納されているものからの 2 つのハッシュを比較します。

ただし、物事をより柔軟にするために、Django はパスワード ハッシュを保存しませんが、ハッシュが生成されたアルゴリズムも保存します。このシナリオを想像してみてください。ハッシュ関数を使用Xしてパスワード ハッシュを生成しますが、何らかの理由でその関数がもはや安全ではないことに気付き、ハッシュ関数に切り替えますY。ただし、その時点で、 function を使用してパスワードハッシュが保存されている人は誰でもXログインできなくなるため、これは問題です。そのため、Django は、ハッシュ値自体に加えて、has が生成されたメソッドも保存します。ここがPASSWORD_HASHERS設定が入ります。 Django がハッシュを生成するメソッドを db に保存しているという事実は、値を読み取るときに、ハッシュ関数自体を実行する方法について Django に実際には通知しません。これPASSWORD_HASHERSは、Python のハッシュ関数 (実際にはクラスですが...) と db に格納されている値の間のマッパーのようなものです。

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

なぜそれが起こるのか、いくつかの理由を考えることができます。

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

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

于 2012-09-15T03:40:56.727 に答える