我正在寻找一种方法来保护使用蜻蜓宝石从 Heroku Rails 3 应用程序上传到 S3 存储的图像。我想以用户为基础控制访问并确保无法直接访问图像。
我找到了其他宝石(例如回形针)的一些信息,但由于蜻蜓的工作方式有点不同,我不确定处理这种情况的首选方法是什么。
我正在寻找一种方法来保护使用蜻蜓宝石从 Heroku Rails 3 应用程序上传到 S3 存储的图像。我想以用户为基础控制访问并确保无法直接访问图像。
我找到了其他宝石(例如回形针)的一些信息,但由于蜻蜓的工作方式有点不同,我不确定处理这种情况的首选方法是什么。
Dragonfly 允许一个:expires
选项是S3DataStoreremote_url
的包装器。url_for
见这里。像使用回形针一样设置一个在 10 秒内过期的受限下载链接怎么样?
您还可以根据此 SO question在其 URL 中为您的图像添加随机 guid,以提供更高的安全性。
不是真正的解决方案,只是一些想法。
由于我目前使用的是路由端点,不幸的是,过期的 url 对我不起作用。
我发现,设置一个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
另一种以编程方式对某些图像执行此操作的方法可以使用put_object_acl
直接在 Dragonfly 的 Fog 存储实例上调用该方法来实现,例如在模型回调中:
app = Dragonfly[:images]
app.datastore.storage.put_object_acl 'bucket-name', model.image_uid, 'private'
这当然只有在使用的存储实际上是雾存储时才有效,因此需要进行检查。
我目前没有对此解决方案进行任何测试,因为它似乎涉及很多嘲笑。因此,如果有人对此解决方案有一些意见,我将非常感谢您听到它!
您可以使用 Amazon S3 的过期 URL。这是一个有过期时间的签名 URL。因此,您生成 URL,将其提供给用户,并由他们在分配的时间内读取该文件。例如,如果您在需要安全的页面中加载图像,请将有效期设置为 10 秒左右。
文件必须存储为显然不是世界可读的。
从蜻蜓来看,这似乎很简单:
my_model.attachment.remote_url(:expires => 10.seconds.from_now)
更多信息在这里: http: //markevans.github.com/dragonfly/file.DataStorage.html#S3_datastore
如果这不起作用,我知道 Paperclip 支持这种行为,因为我过去曾多次使用过它。