2

私はopenx(djangoで実行)に取り組んでおり、ユーザーは他のサイトからここにリダイレクトされ、そこからハッシュ化されたパスワードが与えられています。Authenticate(username,password) は、ハッシュ化されたものではなく、「dragon」のような生のパスワードを除いて、

したがって、「.backend」属性を取得して自分の人生を続けることができるように、ハッシュされたパスワードで authenticate() を使用する必要があります。

login(request,user)認証方法なしで使用する場合。このエラーが表示されます:

request.session[BACKEND_SESSION_KEY] = user.backend
AttributeError: 'User' object has no attribute 'backend'

したがって、認証機能を使用して、ユーザー オブジェクトで .backend 属性を取得する必要があります。

user = authenticate(username=username, password=password)は認証機能の形式です。ここでのパスワードは「abc」のような生のパスワードです。私が持っているのはハッシュ化されたパスワードです (これは、この「abc」パスワードが db に保存される方法です)。

django でハッシュ化されたパスワードを使用して認証およびログインする方法はありますか?

4

2 に答える 2

3

django 用のカスタム認証バックエンドを作成し、そのメソッドをオーバーライドしてauthenticateget_userハッシュされたパスワードとユーザー名を使用して認証することができます。

ハッシュされたパスワードは、テキストが含まれる単なる別のモデルフィールドであるため、データベースでユーザー名とハッシュパス値を使用してユーザーを検索できます。

このようなものが動作するはずです:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class HashedPasswordAuthBackend(ModelBackend):

    def authenticate(self, username=None, password=None):
        try:
            return User.objects.get(username=username, password=password)
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

その後、プロジェクト設定にこの認証バックエンドのパスを含めます。

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'yourapp.backends.HashedPasswordAuthBackend',
]
于 2016-06-29T12:53:47.150 に答える
1

設定で確認できるように、 Open edX はratelimitbackend.backends.RateLimitModelBackend認証に を使用します。このバックエンドでは、認証のためにハッシュ化されていないパスワードが必要です。

ハッシュ化されたパスワードに基づいてユーザーを認証する場合は、django ドキュメントで説明されているように、新しい認証バックエンドを作成する必要があります。

django.contrib.auth.backendsに実装されている Django ModelBackend からインスピレーションを得ることをお勧めします。

欠落しているbackend属性に関連して表示されるエラーは、以前に経験したことがあります。FUN (Open edX プロジェクト)のimpersonate_userビューでは、この問題を次のように解決します (ビュー関数のソース コード内のコメントに注意してください)。

user = get_object_or_404(User, username=username, is_superuser=False, is_active=True)
user.backend = None
login(request, user)
于 2016-06-29T13:04:26.247 に答える