2011-01-11 8 views
5

Chciałbym, aby moja aplikacja Plack wypróbowała kilka różnych sposobów autoryzacji użytkownika. W szczególności sprawdź, czy użytkownik jest już autoryzowany za pomocą pliku cookie sesji, następnie sprawdź uwierzytelnianie Digest, a następnie powróć do Basic.W jaki sposób mogę układać procedury obsługi autoryzacji Plack?

Doszedłem do wniosku, że mógłbym włączyć kilka modułów obsługi Auth w kolejności, w jakiej chciałem je sprawdzić (Session, Digest, Basic). Niestety, zapisano sposób, w jaki zapisano Plack::Middleware::Auth::Digest i Plack::Middleware::Auth::Basic. Oba zwracają 401, jeśli nie istnieje skrót lub podstawowa autoryzacja.

Jak to się zwykle dzieje w Plack?

+0

Nie masz dla siebie odpowiedzi, ale czy nie jest to całkowicie błędne 404? – ysth

+0

Dobrze, 40one11111 (cholerny limit komentarzy) – Schwern

+0

Czy pomoc Ashleya pomogła? – ysth

Odpowiedz

4

Nie mam wdrożenia, ale myślę, że mam podejście. Możesz to zrobić "in-line" z Plack::Middleware::Conditional. Wyglądałoby to tak, ale musisz wypełnić brakujące warunki/testy. Nie widziałem łatwego/oczywistego sposobu, ale podejrzewam, że możesz. Ponieważ musisz przekazać $env, powinieneś być w stanie ustawić/sprawdzić rzeczy HTTP_/session w wybranej kolejności i zachować stan dla następnego handler'a, aby wiedzieć, czy powinien on być włączony czy nie.

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

Myślę, że będziesz musiał napisać własne oprogramowanie pośredniczące, ponieważ idealnie (w oparciu o bardzo szybki odczyt RFC 2617), gdy nie zostanie uwierzytelniony, zwrócisz nagłówek Authenticate WWW z wyzwaniami Basic i Digest (z Basicem jako pierwszym , dla programów klienckich, które rozumieją tylko Basic).

Powiązane problemy