2011-05-18 66 views
10

我已经设置了一个我希望得到最低限度保护的博客(即,我只是想阻止那些我不认识的随机人,没有试图实施类似NSA的安全措施)。我使用Rack :: Auth :: Basic使用toto来“保护”站点。我希望通过index.xml让博客读者能够阅读Feed而不用处理密码(并且是的,我知道这是我的“安全”中的一个大漏洞)。通过Rack :: Auth :: Basic有选择地允许一些网址

如何让Rack :: Auth :: Basic通过这一个url?

这是我加入基本身份验证到我的网站:

use Rack::Auth::Basic, "blog" do |username, password| 
    [username, password] == ['generic', 'stupidanddumbpassword'] 
end 
+0

你有没有考虑使用机架:: URLMap? [This](http://blog.ninjahideout.com/posts/rack-urlmap-and-kicking-ass)是一篇相当不错的关于使用它的博客文章。我不确定它会为你工作。如果你只想让某些人看到某种东西,那么无论是更安全还是普通的电子邮件都是我的建议(只是一个建议,介意:) – iain 2011-05-19 01:18:58

回答

14

怎么样好醇”老式继承?架::验证::基本是一个简单的齿条应用(来源:https://github.com/rack/rack/blob/master/lib/rack/auth/basic.rb),所以有可能重写#CALL方法并跳过认证时请求路径匹配“/index.xml”:

class BlogAuth < Rack::Auth::Basic 

    def call(env) 
    request = Rack::Request.new(env) 
    case request.path 
    when '/index.xml' 
     @app.call(env) # skip auth 
    else 
     super   # perform auth 
    end 
    end 

end 

use BlogAuth, "blog" do |username, password| 
    [username, password] == ['generic', 'stupidanddumbpassword'] 
end 

对于更多背景框架,退房:http://rack.rubyforge.org/doc/SPEC.html

我还没有试过@ Iain关于Rack :: URLMap的建议,但它看起来也可能是一个不错的选择。

3

感谢您的回答!

我也使用了这个解决方案,但做了一个小改动。 因为当前的解决方案可能会导致代码复制,如果一个应用程序将需要一个以上的路径来访问, 我改变了代码:

class AppBasicAuth < Rack::Auth::Basic 
    def call(env) 
    request = Rack::Request.new(env) 
    allowed_paths = ['/api/v2/get_new.json'] 

    if allowed_paths.include? request.path 
     @app.call(env) # skip auth 
    else 
     super   # perform auth 
    end 
end 
end 
相关问题