ユーザーに Apache を使用して WebDav へのアクセスを許可したいのですが、最初にユーザーを認証して、各ユーザーに特定のフォルダーへのアクセスを許可したいと考えています。すべての認証は、Django ベースのデータベースに対して行う必要があります。Django 認証を自分で機能させることはできますが、各ユーザーを認証し、専用の webdav ユーザー固有の領域を提供する部分については助けが必要です。
ヒントはありますか?
まず、他の読者のために、私の認証はWSGI 認証スクリプトを使用して Django に対して行われました。
次に、問題の要点は、各 Django ユーザー (この場合は、他のユーザーから分離された独自の WebDav ディレクトリ) を与えることです。Apache 仮想サイト構成 (通常は/etc/apache2/sites-enabled/内)で次の WebDAV セットアップを想定しています。
<Directory /webdav/root/on/server>
DAV On
# No .htaccess allowed
AllowOverride None
Options Indexes
AuthType Basic
AuthName "Login to your webdav area"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /where/is/the/authentication-script.wsgi
</Directory>
WebDav のパブリック アドレスがまだ設定されていないことに注意してください。これとユーザー領域の問題は、同じ構成ファイル内の 2 行で修正されます (これらは終了句の後に置きます)。
RewriteEngine On
RewriteRule ^/webdav-url/(.*?)$ /webdav/root/on/server/%{LA-U:REMOTE_USER}/$1
これで、webdav はhttp://my-server.com/webdav-url/でアクセスされます。ユーザーはログイン プロンプトを取得し、ユーザー名と同じ名前を持つ webdav ルートのサブディレクトリに移動します。LA-U: Apache を「先読み」させ、マウント パスを決定する前にユーザーがサインインできるようにします。これは、パスがユーザー名に依存するため重要です。なんらかの書き換えルールがなければ、URL は存在せず、ユーザーはログイン プロンプトを受け取りません。つまり、LA-U は、このタイプのログイン処理で catch-22 を回避します。
注意事項: mod_rewrite を有効にする必要があり、ユーザー名は変更なしでディレクトリ名として有効である必要があります。また、ユーザー ディレクトリはこれらのコマンドによって自動的に作成されないため、別の方法でその存在を保証する必要があります。
apache mod_authn_dbdモジュールが必要なものを提供することに気付くかもしれません。このモジュールを使用すると、apache は認証と承認のために SQL データベースをチェックできます。<Location>
保護しようとしている, <Directory>
(etc) 領域でこのディレクティブを使用します。
<Directory /usr/www/myhost/private>
# other config ere
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery \
"SELECT password FROM authn WHERE user = %s"
</Directory>
厳密に言えば、これは、Django アプリ自体ではなく、Django のデータベースに対して認証していることを意味します。クエリを完全に制御できるため、認証を許可する前に、クエリを任意のテーブルの他のパラメーターと組み合わせて、ユーザーが良好な状態であること、または特定のグループに属していることなどを確認できます。
Apache と django の両方で使用されるハッシュ メカニズムが同じであることを確認するために、少し手間がかかる場合があります。
これが適切でない場合は、認証を django データベースから、たとえば LDAP サーバーに移動することを検討してください。カスタム認証バックエンド (django 用の既存の LDAP 実装があります) を使用すると、django は喜んで LDAP を使用します...そして Apache での LDAP auth/auth サポートは非常に堅牢です。
この質問が古いことは知っていますが、追加として... mod_pythonを使用している場合は、Djangoドキュメントの「 ApacheからのDjangoのユーザーデータベースに対する認証」セクションにも興味があるかもしれません。