2011-01-11 13 views
5

Mi piacerebbe avere la mia app Plack provare diversi modi diversi di autorizzare l'utente. In particolare, controlla se l'utente è già autorizzato tramite un cookie di sessione, quindi controlla l'autenticazione Digest e poi torna a Basic.Come impilare i gestori di autenticazione Plack?

Ho pensato che potevo semplicemente abilitare un gruppo di gestori di Auth nell'ordine in cui volevo che fossero controllati (Session, Digest, Basic). Sfortunatamente, il modo in cui sono scritti Plack::Middleware::Auth::Digest e Plack::Middleware::Auth::Basic restituiscono entrambi 401 se Digest o Basic Auth non esiste, rispettivamente.

Com'è normalmente trattato in Plack?

+0

Non hai una risposta per te, ma non è 404 è completamente sbagliato per quello? – ysth

+0

Right, 40one11111 (dannato limite di commenti) – Schwern

+0

La risposta di Ashley è stata di aiuto? – ysth

risposta

4

Non ho un'implementazione ma penso di avere l'approccio. Puoi farlo "in linea" con Plack::Middleware::Conditional. Quindi sembrerebbe questo, ma dovrai compilare le condizioni/test mancanti. Non ho visto un modo facile/ovvio, ma ho il sospetto che potresti. Dal momento che hai il $env da passare in giro dovresti essere in grado di impostare/controllare i file HTTP_/sessione nell'ordine desiderato e mantenere lo stato per il gestore successivo per sapere se deve essere abilitato o meno.

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

Penso che sarà necessario scrivere il proprio middleware, poiché idealmente (basato su una lettura molto veloce di RFC 2617) quando non autenticato si restituirebbe un'intestazione WWW-Authenticate con entrambe le sfide di base e Digest (con Basic prima , per i programmi utente che comprendono solo Basic).

Problemi correlati