Rails 3,paperclip + S3 – 如何存储实例并保护访问权限

我有一个带回形针的Rails 3应用程序,目的是在S3上存储数据。

在应用程序中,用户属于一个实例。

我希望每个实例的所有模型都存储数据。 并且希望阻止来自实例A的用户访问或能够从实例B加载数据。

处理这个问题的最佳方法是什么? 谢谢

我实际上只是在Paperclip的 Ruby on Rails 3应用程序中实现了授权的S3 url。 让我分享一下我是如何做到这一点的

所以我做了什么,你可能想要的东西很容易实现。 让我给你举个例子:

FileObject模型

has_attached_file :attachment, :path => "files/:id/:basename.:extension", :storage => :s3, :s3_permissions => :private, :s3_credentials => File.join(Rails.root, 'config', 's3.yml') 

FileObjectsController控制器

  def download @file_object = FileObject.find(params[:id]) redirect_to(@file_object.attachment.expiring_url(10)) end 

我相信这很简单。 您将Paperclip附件添加到FileObject模型,然后在FileObjectsController中执行操作(例如下载 )。 这样,您可以使用before_filter或其他东西从控制器中执行一些应用程序级别的授权。

@ file_object.attachment上的expiring_url ()方法(由Paperclip提供)基本上向Amazon S3请求一个密钥,该密钥使该文件可以使用该特定密钥访问。 expiring_url()方法的第一个参数采用一个整数,该整数表示您希望提供的URL到期的秒数

在我的应用程序中,它当前设置为10@ file_object.attachment.expiring_url(10) ),因此当用户请求文件时,用户总是必须通过我的应用程序,例如myapp.com/file_objects/3/download从Amazon获取一个新的有效URL,然后用户将立即用它来下载文件,因为我们在下载操作中使用了redirect_to方法。 因此,在用户点击下载操作后大约10秒,链接已经过期并且用户已经(或仍然)愉快地下载文件,同时它仍然受到任何未授权用户的保护。

我甚至尝试设置expiring_url(1),以便在用户触发对URL的Amazon S3请求后URL立即过期。 这在我当地工作,但从未在生产中使用它,你也可以尝试。 但是,我将其设置为10秒,以便为服务器提供短时间的响应时间。 到目前为止工作得很好,我怀疑任何人都会在创建后的10秒内劫持某人的URL,更不用说知道URL是什么了。

我采取的额外安全措施只是为create上的每个文件生成一个密钥 ,所以我的URL总是如下所示:

 has_attached_file :attachment, :path => "files/:id/:secret_key/:basename.:extension" 

因此,每个URL在其路径中都有唯一的secret_key ,这使得在URL可访问的时间内更难劫持。 请注意,虽然文件的URL保持不变,但可访问性来自Amazon S3提供的其他参数,这些参数将过期:

 http://s3.amazonaws.com/mybucket/files/f5039a57acc187b36c2d/my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D 

请注意这部分,这是亚马逊生成和过期的关键,使文件暂时可访问:

 my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D 

这就是它的一切。 如果通过下载操作请求,则会根据您的文件的每个请求进行更改。

希望这可以帮助!

你可以试试这个页面上的内容:

http://thewebfellas.com/blog/2009/8/29/protecting-your-paperclip-downloads

这些说法属于“不再流式传输,重定向时间”一节。

简介: S3具有四种预设访问策略,通过使用经过身份validation的读取策略,S3提供了一种方法,可以为仅在指定时间段内工作的私有内容生成经过身份validation的URL。

我实际上没有这样做,所以请告诉我它是否适合你。 🙂

(转发自我的答案: AWS S3 / Ruby on Rails / heroku:我的应用程序中的安全漏洞 )

最简单的方法是将文件存储为随机的,不可取的名称。 然后,您可以向实例A中的用户显示URL,但实例B用户将无法猜测它们。

这不是防弹安全,但它已经足够好了。 例如,Facebook将这种方法用于用户照片。