如何堆叠Plack身份验证处理程序?

时间:2011-01-11 04:23:14

标签: perl session authentication plack

我想让我的Plack应用程序尝试几种不同的授权用户的方法。具体来说,检查用户是否已通过会话cookie获得授权,然后检查摘要式身份验证,然后再回到基本。

我想我可以按照我希望它们进行检查的顺序启用一堆Auth处理程序(Session,Digest,Basic)。遗憾的是,Plack::Middleware::Auth::DigestPlack::Middleware::Auth::Basic的编写方式如果分别不存在摘要或基本身份验证,则返回401。

普拉克通常如何处理?

2 个答案:

答案 0 :(得分:4)

我没有实施,但我认为我有这种方法。您可以使用Plack::Middleware::Conditional“在线”执行此操作。所以它看起来像这样,但你必须填写缺失的条件/测试。我没有看到一个简单/明显的方式,但我怀疑你可能。由于您有$env来传递,您应该能够按照您想要的顺序设置/检查HTTP_ /会话内容,并保持下一个处理程序的状态以了解是否应该启用它。

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;
};

答案 1 :(得分:2)

我认为您需要编写自己的中间件,理想情况下(基于对RFC 2617的快速读取)未经过身份验证时,您将返回带有基本和摘要挑战的WWW-Authenticate标头(首先使用Basic,对于只了解Basic的用户代理。