Django で HTTP 基本認証を使用できますか?
-
02-07-2019 - |
質問
Apache で実行されている Web サイトにアクセスするには、HTTP 基本認証によって保護された多数の静的ページがあります。
Django の組み込みユーザー管理サポートを使用して、Django でサイトの新しい部分を作成しました。
私が抱えている問題は、ユーザーが HTTP 基本認証経由で一度ログインし、次に Django ログイン フォームを使用して再度ログインする必要があることです。これは不格好であり、ユーザーにとって非常に混乱を招きます。
HTTP 基本認証情報を使用して Django にユーザーをログインさせる方法を誰かが見つけたのだろうかと疑問に思っていました。
Django にパスワードを渡すことは期待していませんが、ユーザーが dave
Apache によって認証されている場合は、次のように Django に自動的にログインする必要があります。 dave
あまりにも。
(1 つのオプションは、Apache と Django でユーザー ストアを共有して、共通のユーザー名とパスワードを確保することです。ただし、これでも 2 つのログイン プロンプトが必要になるため、これは避けたいと考えています。)
解決
これは Django 1.3 リリースに追加されました。これに関する最新のドキュメントをここで参照してください。http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
他のヒント
一部のリクエストで基本認証をサポートするだけの場合 (Web サーバーをいじらない - 質問のタイトルを他の人がどのように解釈するかについては、ここを参照してください)。
Oli のリンクをチェックしてください。基本的に、request.META['REMOTE_USER'] を見ると、Django の基本 HTTP 認証によって検証された認証されたユーザー名が表示されます。
アップデート: チケットに対して提案されたパッチをテストしました #689, 、これは telenieko の git リポジトリで最新の状態で入手できます。 ここ. 。少なくともリビジョンでは正しく適用されます 9084 ジャンゴの。
次の方法でリモート ユーザー認証バックエンドをアクティブ化します。
- 追加
RemoteUserAuthMiddleware
後AuthenticationMiddleware
- 設定を追加する
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)
私と同じように lighttpd と FastCGI を使用する場合は、mod_auth を有効にして、テスト ユーザー (私はこれをそう呼びました) の資格情報を作成します。 testuser
そしてセット 123
パスワードとして)、基本認証を要求するように Django サイトを構成します。
次の urls.py
セットアップをテストするために使用できます。
from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
url(regex='^$',
view=lambda request: HttpResponse(repr(request), 'text/plain')),
url(regex='^user/$',
view=lambda request: HttpResponse(repr(request.user), 'text/plain')),
url(regex='^users/$',
view=lambda request: HttpResponse(
','.join(u.username for u in User.objects.all()),
'text/plain')),
)
lighty と Django FCGI サーバーをリロードした後、サイトのルートをロードすると認証を要求され、 testuser
資格情報を取得し、要求オブジェクトのダンプを出力します。request.META には、次の新しいプロパティが存在する必要があります。
'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'
の /user/
URL を使用して、実際にログインしていることを確認できます。 testuser
:
<User: testuser>
そしてその /users/
URL に自動的に追加されたものがリストされるようになりました testuser
(ここでは admin
するときに作成したユーザー syncdb
も表示されます):
admin,testuser
Django にパッチを適用したくない場合は、 RemoteUserAuthBackend
そして RemoteUserAuthMiddleware
クラスを別のモジュールに追加し、Django 設定でそれを参照します。
がある httpauth.py. 。私はまだ Django の初心者なので、それがどのように正確に適合するのかわかりませんが、探しているものは機能するはずです。
編集:ここにあります この件に関する長いバグスレッド.
django はいくつかの方法で実行でき、Apache と緊密に統合できるのは modpython だけであるため、django が Apache の基本認証で基本的にログインする方法はないと思います。認証は実際にはアプリケーション レベルで実行する必要があります。これにより、より詳細な制御が可能になり、より簡単になります。Python と Apache の間でユーザーデータを共有するという面倒な作業は絶対に望んでいません。
Django のパッチ適用済みバージョンを使用しても構わない場合は、次の場所にパッチがあります。 http://www.djangosnippets.org/snippets/56/ これにより、基本認証をサポートするミドルウェアが提供されます。
基本認証は非常に単純です。ユーザーがログインしていない場合は、401 認証が必要なステータス コードを返します。これにより、ブラウザにログイン ボックスが表示されます。ブラウザはユーザー名とパスワードを bas64 でエンコードされた文字列として提供します。ウィキペディアのエントリ http://en.wikipedia.org/wiki/Basic_access_authentication かなり良いです。
パッチが希望どおりに機能しない場合は、基本認証を自分ですぐに実装できます。
これはカスタムのタスクのようです AuthenticationBackend
- 見る この件に関する Django ドキュメント, 、djangosnippets.org には、そのようなコードの実例がいくつかあります (「 1 または 2) (これは実際には難しいことではありません)。
AuthenticationBackend
サブクラスにはメソッドを 2 つだけ定義する必要があり、そのコードは非常に簡単です。1 つはユーザー ID の User オブジェクトを返す必要があり、2 つ目は資格情報チェックを実行し、資格情報が有効な場合は User オブジェクトを返す必要があります。