在Django / Nginx中限制对静态文件的访问

我正在build立一个系统,允许用户生成一个文件,然后下载它们。 这些文档是PDF文件(对于这个问题不重要),当它们生成时,我将它们存储在我的本地文件系统上,Web服务器上运行着uuid文件名

c7d43358-7532-4812-b828-b10b26694f0f.pdf

但我知道“安全通过默默无闻”是不正确的解决scheme…

如果可能,我想限制对每个帐户的访问权限。 我想我可以做的一件事就是将它们上传到S3并提供一个签名的URL,但是如果可能的话,我现在要避免这种情况。

我正在使用Nginx / Django / Gunicorn / EC2 / S3

什么是其他解决scheme?

如何在视图级强制user==owner ,阻止访问这些文件,将它们存储为FileFields,并且只有在符合条件时才检索文件。

例如你可以在视图上使用@login_required 装饰器 ,只有在登录时才允许访问。这可以通过request.user来检查文件的所有者。 Django文档的User Auth部分在这里很有帮助。

另外一个选项,正如你所提到的,是通过S3本身,在Django中生成具有查询字符串的URL,允许经过身份验证的用户访问下载具有时间限制的特定s3对象。 关于这方面的细节可以在s3文档中找到。 在此之前,还有一个类似的问题。

如果你正在服务的小文件,你可以确实使用Django直接提供服务,将文件写入HttpResponse对象。

但是,如果您正在处理大文件,则可能需要将该任务留在网络服务器上,您可以在Nginx上使用X-Accel-Redirect头文件(以及用于Apache和Lighttpd的X-Sendfile ),让您的网络服务器您。

你可以在这里找到关于头文件本身的更多信息,你可以在这里找到一些关于如何在Django中使用它的灵感 。

一旦完成通过Django视图发送文件,使用Django的认证框架强制用户认证应该是相当直接的。

我用django-private-files取得了很大的成功,它在视图级别执行保护,并使用不同的后端来执行实际的文件传输。