Django のユーザーデータベースに対する Apache からの認証¶
複数の認証データベースを同期させることは Apache を扱う上でよくある問題なので、 Django の 認証システム に対して直接認証するように Apache を設定できます。これには Apache version >= 2.2 と mod_wsgi >= 2.0 が必要です。例えば下記のようなことができます:
- 認証されたユーザにのみ、静的/メディアファイルを Apache から直接提供する。
- 特定のパーミッションを持つ Django ユーザに対して、 Subversion リポジトリへのアクセスを認証する。
- mod_dav で作成された WebDAV 共有に特定のユーザが接続できるように許可する。
注釈
もし カスタムユーザーモデル をインストールしていて、このデフォルトの認証ハンドラを使用したい場合は、 is_active
属性をサポートしている必要があります。グループベースの認可を使用したい場合、カスタムユーザは 'group' という名前のリレーションを持ち、'name' フィールドを持つリレーション先のオブジェクトを参照する必要があります。カスタムの mod_wsgi 認証ハンドラがこれらの要件に適合しない場合は、 独自のカスタムの mod_wsgi 認証ハンドラを指定することもできます。
mod_wsgi
による認証¶
注釈
以下の設定における WSGIApplicationGroup %{GLOBAL}
の使用は、 Apache インスタンスが 1 つの Django アプリケーションだけを実行していることを想定しています。複数の Django アプリケーションを実行している場合は、この設定については mod_wsgi ドキュメントの Defining Application Groups セクションを参照してください。
mod_wsgiがインストールされ、有効になっていることと、 Apache と mod_wsgi をセットアップするステップに従っていることを確認してください。
次に、Apacheの設定を編集して、認証されたユーザだけが閲覧できるようにしたい場所を追加します:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
<Location "/secret">
AuthType Basic
AuthName "Top Secret"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>
WSGIAuthUserScript
ディレクティブは、プロンプトから受け取ったユーザ名とパスワードを渡して、指定した wsgi スクリプトの check_password
関数を実行するように mod_wsgi に指示します。この例では、 WSGIAuthUserScript
は django-admin startproject で作成される アプリケーションを定義する WSGIScriptAlias
と同じです。
Apache 2.2 を認証とともに使う
mod_auth_basic
と mod_authz_user
がロードされていることを確認してください。
これらは Apache に静的にコンパイルされているかもしれませんし、LoadModule を使って httpd.conf
で動的にロードする必要があるかもしれません:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so
最後に、WSGIスクリプト mysite.wsgi
を編集して、 check_password
関数をインポートすることで、Apacheの認証とサイトの認証メカニズムを紐づけます:
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
from django.contrib.auth.handlers.modwsgi import check_password
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
これで、 /secret/
で始まるリクエストはユーザー認証が必要になりました。
mod_wsgi の access control mechanisms documentation に、認証の代替方法についての詳細と情報があります。
mod_wsgi
と Django グループを使った認可¶
mod_wsgi は、グループのメンバーに特定の場所を制限する機能も提供します。
この場合、Apacheの設定は次のようになります:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
<Location "/secret">
AuthType Basic
AuthName "Top Secret"
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
Require group secret-agents
Require valid-user
</Location>
WSGIAuthGroupScript
ディレクティブをサポートするために、同じ WSGI スクリプト mysite.wsgi
は、与えられたユーザが属しているグループのリストを返す groups_for_user
関数もインポートする必要があります。
from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user
これで、 /secret/
に対するリクエストは、ユーザーが "secret-agents" グループのメンバーであることも要求するようになりました。