2017-09-18 1 views
1

Django認証バックエンド(外部パッケージであり、私はそれらを変更したくない)を私の見解で区別しようとしています。 django.contrib.auth docsでは、認証バックエンド(settings.AUTHENTICATION_BACKENDS)が順番に試行され、最初に認証され、返され、request.userが設定され、例外が発生した場合は認証が拒否されます。しかし、どのバックエンドがユーザーを認証したかによって要求を区別することはできません。djangoでは、ログイン後、どの認証バックエンドがユーザーを認証したかをどのように検出できますか?

これは可能ですか?そしてどうやって?

答えて

2

としてはDjango docs for authentication backends settingsで説明:

をユーザーが、バックエンドは、ユーザのセッションでユーザを認証するために使用されたDjangoの格納を認証し、そしていつでもそのセッションの間、同じバックエンドを再利用した後現在認証されているユーザーへのアクセスが必要です。これは効果的に機能login(request, user, backend=None)が使用される場合、この情報は、(django.contrib.auth.__init__.py参照)が格納され、認証元が

実際セッションごとにキャッシュされることを意味します。ユーザーが認証された後、次のセッション情報が格納されています

SESSION_KEY = '_auth_user_id' 
BACKEND_SESSION_KEY = '_auth_user_backend' 
HASH_SESSION_KEY = '_auth_user_hash' 
# [...] 
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) 
request.session[BACKEND_SESSION_KEY] = backend 
request.session[HASH_SESSION_KEY] = session_auth_hash 

だから、あなたはユーザーを認証するために使用されるバックエンドを見つけるためにキー_auth_user_backendのための現在のリクエストのセッションを確認する必要があります。

+0

ありがとうございますが、これは一般的にはうまくいくはずですが、 'settings.AUTHENTICATION_BACKENDS' **やバックエンドで認証バックエンドを設定したくない場合は、オプションの'バックエンド 'paramが' django.contrib.auth.login() '(これらの多くはありません)を呼び出すと、これは動作しません。この場合、私はうまくいけば送信されたログインとログアウト信号を受け取ることに頼らなければならず、認証バックエンドから 'request'オブジェクトを渡して正しく送信され、シグナルハンドラの' request.session'に適切なフラグを手動で設定します。 – aalizadeh

関連する問題