43

Apache で実行されている Web サイトがあり、そこへのアクセスには、HTTP 基本認証によって保護された多数の静的ページがあります。

Django のビルトイン ユーザー管理サポートを使用して、サイトの新しい部分を Django で作成しました。

私が抱えている問題は、ユーザーが HTTP 基本認証を介して 1 回ログインし、次に Django ログイン フォームを使用して再度ログインする必要があることです。これは不器用であり、ユーザーにとって非常に混乱を招きます。

HTTP 基本認証情報を使用して、Django にユーザーをログインさせる方法を誰かが見つけたのではないかと思っていました。

パスワードを Django に渡すことは期待していませんが、ユーザーdaveが Apache によって認証されている場合は、Django にも自動的にログインする必要がありますdave

(1 つのオプションは、Apache と Django でユーザー ストアを共有して、共通のユーザー名とパスワードを確保することですが、これには、私が回避しようとしている 2 つのログイン プロンプトが含​​まれます。)

4

7 に答える 7

38

一部のリクエストで基本的な認証をサポートするだけの場合 (および Web サーバーをいじることはありません。これは、誰かが質問のタイトルを解釈する方法です)、ここを参照してください。

http://www.djangosnippets.org/snippets/243/

于 2009-07-06T15:48:56.157 に答える
25

これは Django 1.3 リリースに追加されました。これに関する最新のドキュメントを参照してください: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

于 2011-05-04T00:42:10.803 に答える
10

Oli のリンクをチェックしてください。基本的に、request.META['REMOTE_USER'] を見ると、Django の基本 HTTP 認証によって認証されたユーザー名が確認されます。

更新:チケット#689の提案されたパッチをテストしました。このパッチは、teleneiko の git リポジトリ (こちら) で最新のものを入手できます。少なくとも Django のリビジョン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 にパッチを適用したくない場合は、クラスRemoteUserAuthBackendRemoteUserAuthMiddlewareクラスを別のモジュールに切り離して、Django 設定で参照するのは簡単です。

于 2008-10-01T07:36:27.347 に答える
3

httpauth.pyがあります。私はまだ Django の完全な初心者なので、Django がどのように適合するかはわかりませんが、探しているものを実行する必要があります。

編集:これは、件名に関するより長いバグ スレッドです。

于 2008-09-30T08:39:35.440 に答える
0

djangoはいくつかの方法で実行でき、modpythonのみがApacheとの緊密な統合を提供するため、djangoがApacheの基本認証に基本的にログインする方法はないと思います。認証は実際にはアプリケーションレベルで行う必要があります。これにより、より詳細な制御が可能になり、より簡単になります。PythonとApacheの間でユーザーデータを共有する煩わしさは本当に必要ありません。

パッチを適用したバージョンのDjangoを使用してもかまわない場合は、http: //www.djangosnippets.org/snippets/56/にパッチがあり、基本認証をサポートするミドルウェアが提供されます。

基本認証は非常に簡単です。ユーザーがログインしていない場合は、401認証が必要なステータスコードを返します。これにより、ブラウザにログインボックスを表示するように求められます。ブラウザは、ユーザー名とパスワードをbas64でエンコードされた文字列として提供します。ウィキペディアのエントリhttp://en.wikipedia.org/wiki/Basic_access_authenticationはかなり良いです。

パッチが希望どおりに機能しない場合は、基本認証を自分で非常に迅速に実装できます。

于 2008-09-30T20:55:26.327 に答える
0

これはカスタムのタスクのようです-AuthenticationBackendこのテーマに関する Django のドキュメントを参照してください。

AuthenticationBackendサブクラスは 2 つのメソッドのみを定義する必要があり、そのコードは非常に単純です。1 つはユーザー ID の User オブジェクトを返す必要があり、2 つ目は資格情報チェックを実行し、資格情報が有効な場合は User オブジェクトを返す必要があります。

于 2008-10-01T09:14:56.437 に答える