我正在构建一个允许用户生成文档然后下载它们的系统。这些文件是PDF(并不是为了这个问题而重要),当它们生成时,我将它们存储在我的本地文件系统上,运行web服务器并使用uuid文件名
c7d43358-7532-4812-b828-b10b26694f0f.pdf
但我知道“通过默默无闻的安全”不是正确的解决方案......
如果可能,我想基于每个帐户限制对这些文件的访问。我认为我可以做的一件事就是将它们上传到S3并提供一个签名的URL,但我想尽可能地避免这种情况。
我正在使用Nginx / Django / Gunicorn / EC2 / S3
还有哪些其他解决方案?
答案 0 :(得分:10)
如果您要提供小文件,您确实可以使用Django直接提供它们,将文件写入HttpResponse
对象。
但是,如果您要提供大型文件,您可能希望将该任务留给您的网络服务器,您可以使用Nginx上的X-Accel-Redirect
标题(以及Apache和Lighttpd的X-Sendfile
标题)您的网络服务器为您提供文件。
您可以找到有关标题本身in Nginx's documentation here的更多信息,您可以找到some inspiration as to how to use that in Django here。
一旦你完成了通过Django视图发送文件,使用Django的auth框架执行用户身份验证应该是非常直接的。
答案 1 :(得分:3)
如何在视图级别强制执行user==owner
,阻止访问文件,将其存储为FileFields,以及仅在满足条件时检索文件。
e.g。您可以使用视图上的@login_required
decorator仅在登录时允许访问。可以使用request.user
来改进以检查文件的所有者。 Django documentation的用户身份验证部分可能会对此有所帮助。
正如您所提到的另一个选项是通过S3本身,在Django中生成URL,其中包含一个查询字符串,允许经过身份验证的用户访问以下载具有时间限制的特定s3对象。有关详细信息,请访问s3 documentation。关于SO here之前已经提出过类似的问题。
答案 2 :(得分:2)
我已经使用django-private-files取得了巨大的成功,它在视图级别实施了保护,并使用不同的后端来进行实际的文件传输。