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

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

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

我没有试过这个,但如果你是从像这样的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

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

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