2012-03-21 44 views
6

靜態文件我建立一個系統,允許用戶生成一個文件,然後下載。這些文檔是PDF文件(對於這個問題不重要),當它們生成時,我將它們存儲在我的本地文件系統上,網絡服務器上運行的文件名爲uuid限制訪問在Django/Nginx的

c7d43358-7532-4812- b828-b10b26694f0f.pdf

但我知道,「通過隱藏的安全」是不正確的解決方案......

我想如果可能的話,他們下文件的每個帳戶基礎來限制訪問。我想我能做的一件事就是將它們上傳到S3並提供一個簽名的URL,但如果可能的話,我現在要避免這種情況。

我使用Nginx的/ Django的/ Gunicorn/EC2/S3

什麼是一些其他的解決方案?

回答

3

如何在視圖級別執行​​,防止訪問文件,將它們存儲爲FileFields,並且只在符合條件時才檢索文件。

例如您可以在視圖上使用@login_requireddecorator以僅在登錄時才允許訪問。可以使用request.user來優化此文件以檢查文件的所有者。 Django documentation的用戶身份驗證部分在此處可能會有所幫助。

另一種選擇,如你提到的是經由S3本身,生成其中有一個查詢字符串允許認證用戶訪問下載特定S3對象與時間限制內的Django網址。有關詳情,請參見s3 documentation。在SO上的here之前已經有類似的問題。

1

我用django-private-files取得了巨大成功,它在視圖級強制執行的保護和利用differente後端做實際的文件傳輸。

10

如果你所服務的小文件,你的確可以使用Django,直接爲他們服務,文件寫入到HttpResponse對象。

如果你然而,供應大文件,你可能想這個任務留給你的Web服務器,您可以使用(針對Apache & lighttpd的和)上的Nginx的X-Accel-Redirect頭有你的Web服務器提供服務的文件給你。

您可以找到有關頭本身in Nginx's documentation here的更多信息,你可以找到some inspiration as to how to use that in Django here

一旦大功告成通過Django的意見發送文件,強制用戶認證使用Django的權威性框架應該是相當straightfoward。