【问题标题】:Restrict access to images in Rails app在 Rails 应用程序中限制对图像的访问
【发布时间】:2012-12-27 16:19:46
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      这样的 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-06
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2020-01-11
        • 1970-01-01
        相关资源
        最近更新 更多