我正在使用Rails应用并使用restful-authentication插件。该应用程序将包括用户图像。只有登录的用户才能浏览,但我想知道我是否也可以限制对图像的直接URL访问,只允许登录用户。
换句话说,即使您知道图像位于thesite.com/user1/foo.jpg
,除非您已登录,否则无法看到该图像。我知道理论上这可以在Apache配置中完成,但是我知道的唯一方法是手动编辑那些无法扩展的文件。
这可能吗?将照片移出public
目录会更有意义吗? (我不确定这是否有任何性能影响,因为public
通常用于静态内容。)
答案 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