Rails - 限制对图像的URL访问?

时间:2010-03-06 18:35:02

标签: ruby-on-rails

我正在使用Rails应用并使用restful-authentication插件。该应用程序将包括用户图像。只有登录的用户才能浏览,但我想知道我是否也可以限制对图像的直接URL访问,只允许登录用户。

换句话说,即使您知道图像位于thesite.com/user1/foo.jpg,除非您已登录,否则无法看到该图像。我知道理论上这可以在Apache配置中完成,但是我知道的唯一方法是手动编辑那些无法扩展的文件。

这可能吗?将照片移出public目录会更有意义吗? (我不确定这是否有任何性能影响,因为public通常用于静态内容。)

2 个答案:

答案 0 :(得分:3)

只有在用户登录时,您才可以为只返回二进制数据的图像创建控制器操作(仅来自不可公开访问的源)。作为前言,我是Django / Python人员,不是Ruby / Rails,但据我所知,配置看起来像这样:

map.connect ':user/:picture', :controller => 'accounts', :action => 'displayPic'

你的实际控制器看起来像:

class AccountsController < ApplicationController
    def image
        # check if user is logged in, then
        user = Account.find(params[:user])
        image = get_image(user, params[:picture])
        send_data(image,
             :filename => "#{params[:picture]}",
             :type => "image/jpeg")
    end

private

    def get_image(image_name)
        # do something to find image
        # and return the binary data
        # to the action
    end
end

将其设为社区维基,因此任何拥有更好Ruby / Rails技能的人都可以清理它

答案 1 :(得分:2)

只需要用户执行操作:

# images_controller.rb
ImagesController < ApplicationController

  before_filter :require_user, :only => 'show'

  def require_user
    unless current_user
      redirect_to root_url # or :back, or wherever
    end
  end

end

但是,您是否真的是指不是通过http://yoursite.com/userfoo/bar.jpg直接访问图片,而是通过http://yoursite.com/images/system/file/5837/bar.jpg?在rails中,您可以检查请求对象:

# images_controller.rb
ImagesController < ApplicationController

  before_filter :require_onsite, :only => 'show'

  def require_onsite
    # pseudoruby, might need some massage
    unless request.referer.match(/request.domain/) 
      redirect_to root_url
    end
  end

end