4

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

4

2 回答 2

4

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

我还没有尝试过,但是如果您从类似的 URL 提供图像

/images/picture_of_mickey_mouse.png

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

例如

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

于 2013-01-13T17:30:35.103 回答
2

文件用ActionDispatch::Static. IMO 最好的解决方案是提供类似的中间件(基于Rails 源代码),但需要一些身份验证并在之前插入ActionDispatch::Static。这适用于基于 Warden 的解决方案(如 Devise),因为它们在中间件中进行身份验证;只需确保您的中间件放在 Warden 之后,而 old plainActionDispatch::Static就在它们之后运行。

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

于 2013-01-13T17:40:07.610 回答