2011-01-11 76 views
5

我想让我的Plack应用程序尝试授权用户的几种不同方式。具体而言,请检查用户是否已通过会话cookie进行授权,然后检查Digest身份验证,然后回退到Basic。如何堆叠Plack身份验证处理程序?

我想我可以启用一串Auth处理程序,我希望它们被检查(Session,Digest,Basic)。不幸的是,编写Plack::Middleware::Auth::DigestPlack::Middleware::Auth::Basic的方式分别是,如果摘要或基本身份验证不存在,它们都会返回401。

Plack中通常会如何处理?

+0

没有答案给你,但不是404是完全错误的吗? – ysth 2011-01-11 04:25:43

回答

4

我没有一个实现,但我认为我有办法。您可以使用Plack::Middleware::Conditional“在线”进行此操作。所以它看起来像这样,但你必须填写缺失的条件/测试。我没有看到一个简单/明显的方式,但我怀疑你可能会。既然你有$env来传递,你应该能够按照你想要的顺序设置/检查HTTP_/session的东西,并且保持下一个处理器的状态以知道它是否应该被启用。

use Plack::Builder; 

my $app = sub { 
    [ 200, 
     [ "Content-Type" => "text/plain" ], 
     [ "O HAI, PLAK!" ] 
    ]; 
}; 

builder { 
    enable "Session::Cookie"; 
    enable_if { my $env = shift; 
       # I don't know... 
      } "Auth::Digest", 
       realm => "Secured", secret => "BlahBlah", 
        authenticator => sub { $_[0] eq $_[1] }; 
    enable_if { my $env = shift; 
       # I don't know... 
      } "Auth::Basic", 
       authenticator => sub { $_[0] eq $_[1] }; 
    $app; 
}; 
2

我认为您将需要编写自己的中间件,因为理想情况下(基于非常快的读取RFC 2617),如果未经过身份验证,您将返回一个带有基本和摘要挑战的WWW-Authenticate标头(使用基本第一,仅用于理解Basic的用户代理)。