我想通过rails app保护我的s3文件,如果我去:
www.myapp.com/attachment/5应在显示/下载文档之前对用户进行身份验证.
我已经在stackoverflow上读过类似的问题,但我不确定我是否看到了任何好的结论.
根据我的阅读,您可以采取一些措施来"保护"您的S3文档.
1)模糊URL.我做到了这一点.我认为这是一件好事,所以没有人可以猜到这个网址.例如,如果您的S3 URL明显,则可以轻松地"遍历"URL:https: //s3.amazonaws.com/myapp.com/attachments/1/document.doc.有一个URL,如:https: //s3.amazonaws.com/myapp.com/7ca/6ab/c9d/db2/727/f14/document.doc似乎好多了.这很好,但不能解决通过电子邮件或网站传递URL的问题.
2)使用如下所示的过期URL: Rails 3,paperclip + S3 - 如何存储实例并保护访问 对我而言,这不是一个很好的解决方案,因为URL是暴露的(即使只是很短的时间)并且另一个用户可能及时重用URL.您必须调整允许下载的时间,而不会提供太多的复制时间.这似乎是错误的解决方案.
3)通过应用程序代理文档下载.起初我尝试使用send_file:http: //www.therailsway.com/2009/2/22/file-downloads-done-right 但问题是这些文件只能是服务器上的静态/本地文件和不通过其他站点(S3/AWS)提供服务.但是,我可以使用send_data并将文档加载到我的应用程序中,并立即将文档提供给用户.这个解决方案的问题很明显 - 带宽的两倍和时间的两倍(将文档加载到我的应用程序然后再返回给用户).
我正在寻找一种能够提供#3完全安全性的解决方案,但不需要额外的带宽和时间来加载.看起来Basecamp正在"保护"他们应用程序背后的文档(通过身份验证),我认为其他网站正在做类似的事情,但我不认为他们正在使用我的#3解决方案.
建议将不胜感激.
更新:
我选择了第四个解决方案:
4)使用amazon存储桶策略来控制基于引用者的文件访问:http: //docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?UsingBucketPolicies.html
再次更新:
#4井可以通过浏览器开发人员的工具轻松解决.所以我仍然在寻找一个可靠的解决方案.
我的配置中有一条路线,表示对于某个页面,/secure
需要登录(通过authlogic完成).我的控制器中的before_filter负责处理.这很好,页面及其资源限制访问 - 通过应用程序.
麻烦的是,我们在部署到heroku的这个应用程序(基于refinerycms)上使用Amazon S3进行存储.我有一个水桶,它工作正常.
但是,可以通过浏览器直接访问插入应用程序安全部分的任何资源.换句话说,该/secure
页面包含pdf文件等项目.虽然通过应用程序可以保护资源,但可以从Internet上的任何位置访问这些pdf文件(示例URL):http://s3.amazonaws.com/my_bucket/images/1234/the_file_which_should_be_secure.pdf
我可以在S3上进行细粒度的访问控制吗?我必须创建一个新桶吗?理想情况下,我想在我的资源上设置一个标志,使其在互联网上不可见 - 不知道.
任何建议都欢迎.
PS openid.org有一个过期的ssl证书,所以需要创建一个新的空帐户,因为我无法登录