Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:如何使用dragonfly保护上传到S3的图像_Ruby On Rails_Heroku_Amazon S3_Dragonfly Gem - Fatal编程技术网

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

Ruby on rails Rails:如何使用dragonfly保护上传到S3的图像,ruby-on-rails,heroku,amazon-s3,dragonfly-gem,Ruby On Rails,Heroku,Amazon S3,Dragonfly Gem,我正在寻找一种方法来保护从Heroku Rails 3应用程序使用蜻蜓宝石上传到S3存储的图像。我希望以用户为基础控制访问,并确保不能直接访问图像 # config/initializers/dragonfly.rb app = Dragonfly[:images] if Rails.env.production? app.datastore.configure do |c| # […] c.storage_headers = {'x-amz-acl' => 'pri

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

# 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

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

蜻蜓允许
:expires
选项用于
远程url
,它是S3DataStore的
url的包装器。看见如果设置一个限制下载链接,该链接将在10秒内过期,就像他们使用的那样

您还可以在图像的URL中为图像添加随机guid,以根据提供更高的安全性


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

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

显然,文件必须以非世界可读的方式存储

从蜻蜓的角度来看,这似乎很简单:

my_model.attachment.remote_url(:expires => 10.seconds.from_now)
更多信息请点击此处:


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

由于我当前使用的是路由端点,很遗憾,过期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
对于某些图像,通过编程实现此操作的另一种方法是直接在蜻蜓的Fog存储实例上调用该方法,例如在模型回调中:

app = Dragonfly[:images]
app.datastore.storage.put_object_acl 'bucket-name', model.image_uid, 'private'
当然,只有在使用的存储实际上是雾存储的情况下,这才会起作用,因此需要进行检查


我目前还没有针对这个解决方案的任何测试,因为它似乎涉及很多模拟。因此,如果有人对这个解决方案有一些意见,我将非常感谢听到它

谢谢,我会检查这个选项然后回来。谢谢,听起来很有趣。我还通过路由端点直接获取图像,这是蜻蜓提供的功能。我必须看看我是否也能做到这一点。嗨,polarblau-你是如何通过你的应用程序访问这些信息的?你的应用程序是网页吗?如果是这样的话,需要什么语法来渲染图像?如前所述,我使用的是Dragonfly(Ruby gem),在本例中使用的是Rails。以下是文件:嗨,波兰布劳-我是在蜻蜓本身的背景下问这个问题的。您共享了确保S3上的图像标记为私有的代码。在将这些图像存储为“私有”后,如何从最终用户的浏览器访问它们?您是使用服务器端代码获取图像,然后将其写入http响应,还是使用更方便的方法?如果你能分享那条信息那就太好了。我已经扫描了蜻蜓的文档,我没有看到任何类似的东西。我明白了。嗯,我只是在使用标准的蜻蜓方法(例如,
@model.image.url
表示全尺寸,或者
@model.image.thumb('250x250>)
表示缩略图)。由于dragonfly对图像的所有请求都通过服务器进行,所以一切似乎都像以前一样正常。这对你有帮助吗?是的,这正是我想要的!谢谢