Rails:如何使用dragonfly保护上传到S3的图像

时间:2012-01-16 22:34:01

标签: ruby-on-rails heroku amazon-s3 dragonfly-gem

我正在寻找一种方法来保护使用蜻蜓宝石从Heroku Rails 3应用程序上传到S3存储的图像。我想基于用户控制访问,并确保无法直接访问图像。

我已经找到了其他宝石的一些信息,比如回形针,但由于蜻蜓的工作方式有点不同,我不确定处理这种情况的首选方法是什么。

3 个答案:

答案 0 :(得分:2)

Dragonfly允许:expires的{​​{1}}选项,它是S3DataStore remote_url的包装器。见here。如何设置限制下载链接,在10秒内过期,就像使用paperclip一样?

您还可以在其网址中为图片添加随机guid,以便根据this SO question提供更高的安全性。

不是一个真正的解决方案,只是一些想法。

答案 1 :(得分:1)

您可以使用Amazon S3的过期网址。这是一个签名的URL,具有到期时间。因此,您生成URL,将其提供给用户,并由他们在指定的时间内读取该文件。例如,如果您要在页面中加载需要安全的图像,请将到期时间设置为10秒左右。

文件必须存储为NOT世界可读。

从观看Dragonfly看起来很简单:

my_model.attachment.remote_url(:expires => 10.seconds.from_now)

此处有更多信息:http://markevans.github.com/dragonfly/file.DataStorage.html#S3_datastore

如果这不起作用,我知道Paperclip支持这种行为,因为我过去曾多次使用它。

答案 2 :(得分:1)

由于我目前正在使用路由端点,遗憾的是,过期的网址对我不起作用。

我发现,设置x-amz-acl标头来设置权限,在我的情况下有效,因为所有图像都是通过应用程序专门访问的,而且从不直接访问。

# config/initializers/dragonfly.rb
app = Dragonfly[:images]

if Rails.env.production?
  app.datastore.configure do |c|
    # […]
    c.storage_headers = {'x-amz-acl' => 'private'}
  end
end

通过直接在Dragonfly的Fog存储实例上调用方法put_object_acl,可以实现以编程方式对某些图像执行此操作的另一种方法。在模型回调中:

app = Dragonfly[:images]
app.datastore.storage.put_object_acl 'bucket-name', model.image_uid, 'private'

这当然只有在使用的存储实际上是雾存储时才有效,因此需要进行检查。

我目前没有对此解决方案进行任何测试,因为它似乎涉及很多嘲弄。所以,如果有人对此解决方案有一些意见,我将非常感谢您的回复!