1

我想在我的模块化 Sinatra 应用程序中对特定路由使用 HTTP Digest 身份验证。

sinatra recipes 网站中列出的示例仅描述了如何为整个应用程序启用摘要身份验证。为使其适用于特定路由而提出的解决方案是创建两个单独的应用程序,(一个具有摘要身份验证,另一个没有)将受保护和不受保护的路由放置在各自的应用程序中。

这将需要以下内容:

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 应用程序中的单个路由,而无需创建全新的应用程序?

常见问题解答中有一个示例,其中引用了创建 Rack::Auth::Basic::Request 的实例并传入环境,但是使用摘要身份验证执行此类操作会大不相同,并且更像是手动身份验证过程。

这是基本的身份验证示例:

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

有人对如何做到这一点有想法吗?

4

1 回答 1

0

使用前置过滤器。您是否需要对同一条路线采取不同的行为?

于 2012-06-23T12:23:53.503 回答