2011-01-11 12 views
5

Me gustaría que mi aplicación Plack pruebe diferentes formas de autorizar al usuario. Específicamente, verifique si el usuario ya está autorizado a través de una cookie de sesión, luego verifique la autenticación implícita y luego vuelva a Basic.¿Cómo apilo los controladores de autenticación de Plack?

Pensé que podía habilitar un grupo de controladores de Auth en el orden en que quería que fueran revisados ​​(Session, Digest, Basic). Desafortunadamente, la forma en que se escriben Plack::Middleware::Auth::Digest y Plack::Middleware::Auth::Basic ambos devuelven 401 si no existe el resumen o la autenticación básica, respectivamente.

¿Cómo se trata esto normalmente en Plack?

+0

¿No tiene una respuesta para usted, pero no es 404 está completamente equivocado para eso? – ysth

+0

Derecha, 40one11111 (maldito límite de comentarios) – Schwern

+0

¿La respuesta de Ashley fue útil? – ysth

Respuesta

4

No tengo una implementación, pero creo que tengo el enfoque. Puede hacer esto "en línea" con Plack::Middleware::Conditional. Por lo tanto, se vería así, pero deberá completar las condiciones/pruebas faltantes. No vi una manera fácil/obvia, pero sospecho que podrías. Como tiene que pasar el $env, debería poder establecer/verificar HTTP_/sesión en el orden que desee y mantener el estado para que el siguiente controlador sepa si debe habilitarse o no.

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

Creo que va a necesitar escribir su propio middleware, ya que idealmente (basado en una lectura muy rápida de RFC 2617) cuando no está autenticado devolvería un encabezado WWW-Authenticate con desafíos básicos y Digest (primero con Basic , para agentes de usuario que solo entienden Básico).

Cuestiones relacionadas