2016-11-19 9 views
2

私はApacheを使用してDjangoアプリケーションをデプロイし、デコレータを使用してほとんどのビューで認証をチェックします。Django - カスタムlogin_requiredデコレータでApacheに提供されるメディアファイルを保護

@custom_decorator 
def myView(request): 
    bla bla bla... 

それはジャンゴが付属しています@login_requiredデコレータではないのですが、それが唯一の特定のグループからのユーザーへのアクセスを可能にする以外は、ほぼ同じことです。これは意図したとおりに動作します。

また、私はこのように、Apacheでメディア(ユーザーがアップロード)ファイルを提供しています:

Alias /media /path/to/media 
<Directory /path/to/media> 
    Require all granted 
</Directory 

私はうまくメディアファイルにアクセスすることができますが、問題は私も私であればそれらにアクセスできることです

mySite/media/myFile.png 

うまくいけば、カスタムデコレータを使用して、メディアファイルへのアクセスを制限する方法はあります:、単に同じように、手動でURLを入力してログインしていない「メートル?

私は同様の質問に遭遇しました:How do you Require Login for Media Files in Djangoしかし、残念ながら答えは私の頭の上に行きました。

ありがとうございます!

答えて

1

Apacheのメディアパスについて言及すると、これらのファイルはApache(またはNginxまたは他のWebサーバー)によって直接処理されます。これらのリクエストはあなたのDjangoアプリケーションを経由することさえありません。したがって、これらの要求やそれらによって提供されるデータを制御することはできません。

静的/メディアファイルを提供するために別のAPIを作成する方法もあります。そのAPIでは、他のコンテンツと同じ検証を行います。

さらに良いことに、あなたはAWS (Amazon Web Services)GCP (Google Cloud Platform)アカウントをお持ちの場合は、それぞれS3またはCloud Storage上の静的ファイルを保存して、API経由でファイルの彼らのURLを提供しています。

PS:メディアのパスをApacheの設定から削除することを忘れないでください。それ以外の場合、Apacheはこれらのファイルを提供し続けます。 Sarafeim's answer to Restricting access to private file downloads in Djangoで述べたよう


あるいは、両方のサーバとアプリケーション側で修正を必要とします。要求を出した特定のユーザーにファイルを提供することができたら、HTTPサーバーがアプリケーションサーバーに尋ねる方法が必要です。これは、X-SendFileメカニズムを使用するdjango-sendfileを使用して実現できます。 ジャンゴ-sendfileののREADMEあたりのとおり:

これは、Webクライアントにファイルを送信するためのWebサーバー固有のメソッドのラッパーです。これは、Djangoが関連ファイルのアクセス権をチェックする必要があるが、ファイル自体の実際のバイトを扱いたくない場合に便利です。すなわち、大きなファイルを扱うのは、Djangoが作られたものではありません。

sendfileのメカニズムについての詳細を理解するために、読み:Django - Understanding X-Sendfile

+1

参考にしていただきありがとうございます。5回のような詳細情報を追加するよう編集しました。私は元の記事をソリューションで編集しました、ありがとう! – Sauvent

+1

@Sauvent:元の投稿の回答としてその情報を追加する方が良いでしょう。質問は質問の場所です、回答は回答です:)また、あなたがしたことに戻って私たちと共有してくれてありがとう。これは将来問題に直面する人にとって有益でしょう。 –

+0

私はそれが元々どのように質問を編集し、別々に答えを投稿しました。 – Sauvent

1

わかりましたので、@MoinuddinQuadriの答えとリンクに基づいて、最も簡単な解決策は、通常のDjangoのビューを使ってファイルを提供しているようだ、と

@custom_decorator 
viewFile(request, objectID): 
    object = MyModel.object.get(id = objectID) 
    return HttpResponse(object.file, content_type = "image/png") 

(ビューでは、私はファイル名の代わりにオブジェクトのIDを渡すので、私の場合、私は、モデルに関連するFileFieldにサービスを提供したかった):このような目的のデコレータを適用します。

また、私は、Apacheのconfに対応するコードをコメントアウト:

### Alias /media /path/to/media 
### <Directory /path/to/media> 
###  Require all granted 
###</Directory 

は私ではなく、メディアファイルのURLを新しいビューを使用するために、いくつかのテンプレートを変更しなければならなかったが、今では、意図したとおりに動作しますログに記録されていないユーザーをロックアウトします。

しかし、これはApacheを使用してファイルを提供することはなく、Django自体を使用しています。according to the docsは不適格であり、推奨されません。

理想的には、Apacheを使用してファイルを提供し、そのアクセスを保護するためにビューを使用したい場合は、mod_xsendfileをApacheに使用するか、ちょうど上記のモジュールのラッパーであるを使用します。

私は後者を試しましたが、残念ながらit has problems with file names that have non-ascii charactersです。私のターゲットはスペイン語を話すユーザーであるため、少なくとも現在はDjangoでファイルを提供するだけです。

関連する問題