在Rails应用程序中限制对图像的访问

时间:2013-01-13 17:18:42

标签: ruby-on-rails ruby-on-rails-3 image file role

我有rails项目。在我的项目中,我在服务器上加载图像(rails 3 + paperclip + devise + cancan)。我想限制对文件的访问(例如,原始图像只能由管理员查看)。我该怎么办?

2 个答案:

答案 0 :(得分:4)

如果您要限制数据库中的属性,那么一种方法是通过控制器提供图像。它不是最高效的,但它是安全的。

我没有尝试过这个,但是如果您从像

这样的网址提供图像

/images/picture_of_mickey_mouse.png

然后您可以在应用中创建一个路径,该路由使用文件名属性响应/images并通过控制器提供所有这些图像。

e.g。

class ImagesController < ApplicationController
  before_filter :authenticate_admin!, :only => [:show]
  def show
    send_file "/images/#{params[:filename]}", :disposition => 'inline'
  end
end

您可能希望确保清理params[:filename],否则用户可以下载服务器上的任何文件!

send_file上的文档位于:http://apidock.com/rails/ActionController/DataStreaming/send_file

答案 1 :(得分:2)

使用ActionDispatch::Static处理文件。 IMO最好的解决方案是提供类似的中间件(基于Rails source code)但有一些身份验证并在ActionDispatch::Static之前插入它。这适用于基于Warden的解决方案(如Devise),因为它们在中间件中进行身份验证;确保你的中间件放在Warden之后,旧的ActionDispatch::Static就在它们之后运行。

编辑:还有一件值得注意的事情。在制作中很常见的是Nginx(我不确定Apache和其他人)被配置为自己提供所有静态文件,而不将这些请求传递给机架堆栈。您可能需要禁用此Nginx功能。