Apache での認証に Django のユーザデータベースを使う

revision-up-to:17812 (1.4)

Warning

mod_python のサポートは、 Django で廃止予定です。廃止された時点で、 認証用のメソッドは Django で提供されなくなります。コミュニティーとして は、 WSGI ミドルウェアやその他のアプローチを使用した代替案を提案して います。

Apache を使っていると、同期を保ちながら複数の認証データベースを維持するとい う問題によくぶつかります。 Apache の認証を Django の 認証システム で行えば、以下のような処理を実現できます:

  • 認証ユーザだけを対象に、静的ファイル/メディアファイルを Apache から 直接提供できます。
  • 特定のパーミッションを持つ Django ユーザだけに Subversion リポジト リへのアクセスを許すよう認証をかけられます。
  • mod_dav で作成した WebDAV 共有への接続を特定ユーザに許可できます。

Apache の設定

Django の認証データベースを Apache 設定ファイルからチェックするには mod_python の標準の Auth* および Require ディレクティブと共に、 PythonAuthenHandler ディレクティブを使います:

<Location /example/>
    AuthType Basic
    AuthName "example.com"
    Require valid-user

    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonAuthenHandler django.contrib.auth.handlers.modpython
</Location>

Apache 2.2 で認証ハンドラを使う場合

Apache 2.2 を使っている場合には、あと 2 ステップほど作業が必要です。

まず、 mod_auth_basicmod_authz_user をきちんとロードさせね ばなりません。これらのモジュールは、 Apache のコンパイル時に静的に組み 込まれているか、 LoadModule を使って動的に組み込みます (この囲みの 末尾に例があります) 。

また、 Apache が他の認証用モジュールを使おうとしないように、設定のため のディレクティブを挿入しておき、 AuthUserFile/dev/null に指 定しておく必要があります。ロードした認証モジュールによって、以下のいず れか、または複数のディレクティブが必要です:

AuthBasicAuthoritative Off
AuthDefaultAuthoritative Off
AuthzLDAPAuthoritative Off
AuthzDBMAuthoritative Off
AuthzDefaultAuthoritative Off
AuthzGroupFileAuthoritative Off
AuthzOwnerAuthoritative Off
AuthzUserAuthoritative Off

Apache 2.2 での設定全体を、2.0 との違いを太字にして示します:

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

...

<Location /example/>
    AuthType Basic
    AuthName "example.com"
    AuthUserFile /dev/null
    AuthBasicAuthoritative Off
    Require valid-user

    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonAuthenHandler django.contrib.auth.handlers.modpython
</Location>

デフォルトでは、認証ハンドラは staff のマークのついたメンバだけに /example/ へのアクセスを制限します。この挙動を変更したければ、 以下の PythonOption ディレクティブを使います:

PythonOption 説明
DjangoRequireStaffStatus

on に設定すると、 “staff” ユーザ (is_staff フラグの立っているユーザ) だけにアクセスを許可します。

デフォルトの設定値は on です。

DjangoRequireSuperuserStatus

on に設定すると、スーパユーザ (is_superuser フラグの立っている ユーザ) だけにアクセスを許可します。

デフォルトの設定値は off です。

DjangoPermissionName

アクセスに必要なパーミッションの名前 です。詳しくは カスタムのパーミッション を参照 してください。

デフォルトの設定では、 特定のパーミッションを必要としません。

場合によって、 SetEnv が mod_python の設定としてうまく働きません。 この原因はよくわかっていません。 mod_python が DJANGO_SETTINGS_MODULE をうまく認識できない場合、 SetEnv の代りに PythonOption を使ってみ て下さい。以下の二つのディレクティブは同じ意味です:

SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonOption DJANGO_SETTINGS_MODULE mysite.settings