32

サイトのユーザー登録セクション内で、ダウンロード可能な PDF とスプレッドシートで「機密」情報を提供しています。

django認証がこのメディアを提供せずに保護できるようにする方法はありますか(基本認証を使用して手動でログインする必要はありません)?

以下の疑似コードでそれを行う方法はない(指を交差させた)と思いますが、最終目標をよりよく説明するのに役立ちます。

#urls.py
(r'^protected_media/(?P<filename>.*)$', 'protected_media')

#views.py
from django.contrib.auth.decorators import login_required

@login_required
def protected_media(request, filename):
    # @login_required bounces you out to the login url
    # if logged in, serve "filename" from Apache
4

4 に答える 4

11

コードで概説した方法が機能するはずです。他の保護されたリソースとまったく違いはありません。ビューは、ディスクからのファイル、データベースからのレコード、レンダリングされたテンプレートなどを提供できます。login_required デコレーターが他のビューへの不正アクセスを防ぐのと同様に、保護されたメディアを提供するビューへのそのようなアクセスを防ぎます。

ここであなたの質問に何か欠けていますか?その場合は明確にしてください。

編集:コメントのdjango docリンクに関して:これは、特定のディレクトリからリクエストファイルを単純に提供する方法です。そのため、この例では、 のような URL は/site_media/foo.jpg、およびの下/site_media/somefolder/bar.jpgのファイルを自動的に検索します。基本的に、以下のものはすべて公開されます。それは明らかに安全ではありません。したがって、メソッドでそれを回避します。foo.jpgsomefolder/bar.jpgdocument_rootdocument_root

また、必要なのはURLリクエストを取得してハードドライブ上のファイルにマップするApacheのようなものである場合、djangoは多くの不要なオーバーヘッドを追加するだけであるため、非効率的であると見なされます. (django セッション、リクエスト処理などは必要ありません。)

あなたの場合、これはそれほど大きな問題ではないかもしれません。まず、ビューを確保しました。次に、使用パターンによって異なります。これらのファイルに対して何件のリクエストが予想されますか? 認証にdjangoのみを使用しています-それは他のオーバーヘッドを正当化しますか? そうでない場合は、これらのファイルを Apache で提供し、認証プロバイダーを使用することを検討できます。詳細については、次のmod_wsgiドキュメントを参照してください。

mod_python私は信じていますの下で利用可能な同様のメカニズムがあります。(更新:他の回答に気づきました。方法については、アンドレの回答を参照してくださいmod_python。)

編集 2: ファイルを提供するためのコードに関しては、次のスニペットを参照してください。

このsend_fileメソッドは、大きな静的ファイルを送り返すのに適した FileWrapper を使用します (ファイル全体をメモリに読み込むわけではありません)。content_type送信するファイルの種類 (pdf、jpg など) に応じてを変更する必要があります。

于 2009-07-11T20:47:38.377 に答える
5

詳細については、このDjango チケットを参照してください。時間を節約するために、一番下から始めてください。Django 1.2 に取り込めなかったようで、1.3 にも入っていないと思います。

Nginx の場合、X-Accel-Redirect ヘッダーを利用するこのDjango スニペットを見つけましたが、まだ試していません。

于 2010-12-07T19:42:50.787 に答える
3

あなたの質問が正しく理解できた場合、たとえば Apache サーバーなど、Django によって提供されていないファイルへのアクセスを制限したいですか?

次に必要なのは、この Apache サーバーが Django を認証ソースとして使用するための何らかの方法です。

このdjango スニペットは、そのような方法を説明しています。Django でアクセス ハンドラを作成します。このハンドラは、保護する必要がある静的ファイルのリクエストが届いたときに Apache によって使用されます。

<Location "/protected/location">
            PythonPath "['/path/to/proj/'] + sys.path"  
            PythonOption DJANGO_SETTINGS_MODULE myproj.settings
        PythonOption DjangoPermissionName '<permission.codename>'
        PythonAccessHandler my_proj.modpython #this should point to accesshandler
            SetHandler None
</Location>

スニペットは少し前に投稿されたので、Django のバージョン間で変更されている可能性があります :)

于 2009-07-11T21:28:57.060 に答える
3

Django による静的ファイルのより効率的な提供は、現在 Google SOC プロジェクトの一部として検討されています。WSGI の場合、利用可能な場合は mod_wsgi の場合と同様に WSGI の wsgi.file_wrapper 拡張機能を使用し、mod_python を使用する場合は req.sendfile() を使用します。また、'Location'、'X-Accel-Redirect' などのヘッダーを返すこともサポートします。これらのヘッダーは、さまざまな Web ホスティング メカニズムとプロキシ フロント エンドが、場所がバックエンド Web アプリケーションによって定義される静的ファイルを提供する手段として受け入れます。 、静的ファイルを提供するためのフロントエンドほど効率的ではありません。

Django wiki のどこかにこのプロジェクト ページがあるかどうかはわかりませんが、コードの変更は Django ソース コード リポジトリの branch/soc2009/http-wsgi-improvements ブランチにコミットされています。

そのようなものを厳密に待つ必要はありません。それは、さまざまなメカニズムにわたってクリーンでポータブルなインターフェースを配置するだけです。Apache/mod_wsgi の前のフロント エンドとして nginx を使用する場合、X-Accel-Redirect を使用できます。Apache/mod_wsgi 3.0 とデーモン モードを使用している場合は、ここで Location を使用できますが、Apache を正しく設定する必要があります。または、Django アプリケーションの周りに独自の WSGI ミドルウェア ラッパーを実装することもできます。これは、返されるファイルを示すために独自の応答ヘッダーを探し、Django から返される実際の応答の代わりに wsgi.file_wrapper を使用してそれを返します。

ところで、他の人が mod_python と mod_wsgi の両方に対してリストした認証フックメカニズムは、HTTP 基本認証を使用しますが、これはあなたが望んでいたものではありません。これは、Cookie とバックエンド セッションを使用する Django フォーム ベースのログイン メカニズムによってファイルを保護することを前提としています。

于 2009-07-12T04:01:18.947 に答える