对单个路由使用HTTP摘要式身份验证

时间:2012-06-22 21:35:17

标签: ruby sinatra rack digest-authentication http-digest

我想在我的模块化Sinatra App中对特定路由使用HTTP摘要身份验证。

sinatra recipes website中列出的示例仅描述了如何为整个应用启用摘要身份验证。为特定路线提供此解决方案的解决方案是创建两个单独的应用程序(一个具有摘要认证,另一个没有)将受保护和未受保护的路径放置在各自的应用程序中。

这需要以下内容:

require 'sinatra/base'

class Protected < Sinatra::Base
  use Rack::Auth::Basic, "Protected Area" do |username, password|
    username == 'foo' && password == 'bar'
  end

  get '/' do
    "secret"
  end
end

class Public < Sinatra::Base
  get '/' do
    "public"
  end
end

这对我来说似乎有点过分了。

有没有办法在模块化的sinatra应用程序中保护单条路线,而无需创建全新的应用程序?

FAQ中有一个例子,它引用了创建Rack :: Auth :: Basic :: Request的实例并传入环境,但用digest auth做这样的事情会有很大的不同,而且会更多手动验证程序。

以下是基本身份验证示例:

def authorized?
  @auth ||=  Rack::Auth::Basic::Request.new(request.env)
  @auth.provided? && 
    @auth.basic? && 
    @auth.credentials &&
    @auth.credentials == ['admin', 'admin']
end

有没有人想过如何做到这一点?

1 个答案:

答案 0 :(得分:0)

使用之前的Filters。你对同一条路线需要不同的行为吗?

相关问题