2012-03-21 23 views
6

私は、ユーザーが文書を生成してからダウンロードすることができるシステムを構築しています。ドキュメントはPDFです(この質問のために重要ではありません)。これらのファイルは、WebサーバーがUUIDファイル名で実行しているローカルファイルシステムに格納します。Django/Nginxで静的ファイルへのアクセスを制限する

c7d43358-7532-4812- b828-b10b26694f0f.pdf

が、私は可能であれば、彼らは、アカウントごとにファイルへのアクセスを制限したい

...「あいまいを通じてセキュリティは」適切なソリューションではありません知っています。私ができると思うことの1つは、それらをS3にアップロードして署名付きのURLを提供することですが、可能ならばこれを避けたいと思います。

私はいくつかの他のソリューションとは?nginxの/ジャンゴ/ Gunicorn/EC2/S3

を使用していますか

答えて

3

ビューレベルで強制的にファイルへのアクセスを防止し、FileFieldとして保存し、その条件が満たされている場合にのみファイルを取得する方法について説明します。

ビューに@login_requireddecoratorを使用して、ログインした場合にのみアクセスを許可することができます。これは、ファイルの所有者を確認するためにrequest.userを使用して洗練されます。 Django documentationのユーザー認証セクションはここで役立ちそうです。

もう1つのオプションは、S3自身を介してDjango内にURLを生成するものです。これには、認証されたユーザーのアクセスに時間制限付きで特定のs3オブジェクトをダウンロードさせるクエリ文字列があります。その詳細はs3 documentationにあります。同様の質問がhereより前に尋ねられました。

1

私はdjango-private-filesを大いに成功させました。これはビューレベルで保護を実施し、異なるバックエンドを使用して実際のファイル転送を行います。

10

小さなファイルを提供している場合、実際にDjangoを使用してファイルを直接提供し、ファイルをHttpResponseオブジェクトに書き込むことができます。

あなたはしかし、大規模なファイルを提供している場合、あなたはあなたのウェブサーバがあなたのためにファイルを提供持ってX-Accel-Redirect nginxの上のヘッダ(およびApache & Lighttpdのため)を使用することができ、ウェブサーバーにそのタスクを残すこともできます。

ヘッダー自体について詳しくは、in Nginx's documentation hereをご覧ください。some inspiration as to how to use that in Django hereがあります。

Djangoのビューを使ってファイルを送信したら、Djangoの認証フレームワークを使用してユーザー認証を強制的に行うべきです。