2012-07-11 49 views
1

可以说,我有一个形象的app /资产/图像/ privateimages/myrestrictedimage1.jpg 如果我尝试直接去通过URL图像的东西,如的Rails 3:如何拦截任何HTTP请求

http://localhost:5555/assets/privateimages/myrestrictedimage1.jpg 

我可以查看图像。

我想有一种方法来检查任何http请求,以决定是否允许用户访问它。

我知道在继续执行任何控制器动作之前,我可以在控制器中使用before_filter进行一些预处理,但我不认为这会帮助我,因为我需要尝试执行控制器操作才能使其生效。

我听说我可以用耙子做任务,但经过大量搜索后,我还没有找到像我正在尝试做的事情。也许我必须创建一个红宝石来做到这一点,但我不知道如何做到这一点。

任何人都可以指向正确的方向吗?谢谢。

回答

3

我使用Rack中间件

中间件类看起来是这样的:

class MyChecker 
    def initialize(app) 
    @app = app  
    end     

    def call(env) 
    if (docheck) 
     #do stuff here such as check the path. 
     #For example @path = env['PATH_INFO'] and compare against your okay paths 
     #if youre good and are able to continue then 
     @app.call(env) 
    else 
     #redirect such as 
     [301, {"Location" => /somewhere, "Content-Type" => "text/html"}, []] 
    end 
    end 

end 

确保让你的中间件可见通过添加以下到application.rb中

class Application < Rails::Application 
    ... 
    config.autoload_paths += %W(#{config.root}/lib) #if MyChecker is located in lib othewise substitute lib with wherever you have your middleware class 
    config.middleware.use "MyChecker" 
end 
2

你想看看Rack(不是耙)。

+0

大量的阅读后在Rack上,我相信这可能是一条路,我只是不知道如何。到目前为止,大多数Rack示例只是使用Rack应用程序显示一些文本。我找不到一个如何用Rack做其他类型逻辑的例子,然后继续。因此,例如,如果用户转到http:// localhost:3000/*,那么会执行一些对url执行检查的代码,如果检查通过,则用户可以继续正常工作,否则它们会被重定向到其他网址。 – snowleopard 2012-07-13 17:23:04