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