Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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应用程序中限制对图像的访问_Ruby On Rails_Ruby On Rails 3_Image_File_Role - Fatal编程技术网

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

Ruby on rails 在Rails应用程序中限制对图像的访问,ruby-on-rails,ruby-on-rails-3,image,file,role,Ruby On Rails,Ruby On Rails 3,Image,File,Role,我有一个rails项目。在我的项目中,我将图像加载到服务器上(rails 3+回形针+Desive+cancan)。我想限制对文件的访问(例如,原始图像只能由管理员查看)。我该怎么做呢?如果您受到数据库中某个属性的限制,那么一种方法就是通过控制器为图像提供服务。这不是性能最好的,但很安全 我还没有尝试过,但是如果你是从一个像 /images/picture\u of_mickey\u mouse.png 然后,您可以在应用程序中创建一个路由,该路由使用filename属性响应/images,并通

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

如果您受到数据库中某个属性的限制,那么一种方法就是通过控制器为图像提供服务。这不是性能最好的,但很安全

我还没有尝试过,但是如果你是从一个像

/images/picture\u of_mickey\u mouse.png

然后,您可以在应用程序中创建一个路由,该路由使用filename属性响应
/images
,并通过控制器为所有这些图像提供服务

e、 g

class ImagesController[:显示]
def秀
发送_文件“/images/#{params[:filename]}”,:disposition=>“inline”
结束
结束
但是,您需要确保清理
参数[:filename]
,否则用户将能够下载服务器上的任何文件


send\u file
上的文档位于此处:

使用
ActionDispatch::Static
处理文件。IMO最好的解决方案是提供类似的中间件(基于),但带有一些身份验证,并在
ActionDispatch::Static
之前插入它。这将与基于Warden的解决方案(如Desive)配合使用,因为它们在中间件中进行身份验证;只需确保您的中间件放在Warden之后,旧的plain
ActionDispatch::Static
就在它们之后运行

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

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