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

AnA*_*ice 23 ruby-on-rails amazon-s3 paperclip ruby-on-rails-3

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

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

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

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

Mic*_*jen 54

我实际上只是在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')
Run Code Online (Sandbox Code Playgroud)

FileObjectsController控制器

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

我相信这很简单.您添加回形针附着在文件对象模型,然后有一个动作(下载在例如)FileObjectsController.这样,您可以使用before_filter或其他东西从控制器中执行一些应用程序级别的授权.

所述expiring_url()方法(通过提供回形针上)@ file_object.attachment基本上请求亚马逊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"
Run Code Online (Sandbox Code Playgroud)

因此,每个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
Run Code Online (Sandbox Code Playgroud)

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

my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!


Ada*_*21e 5

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

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

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

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

我实际上没有这样做,所以如果它适合你,请告诉我.:-)

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