2010-06-25 29 views
5

He intentado autenticar mi aplicación CGI a través de 2 controladores, uno que usa nombre de usuario/contraseña almacenado en la base de datos y otro que usa el directorio activo ldap.Autenticación de aplicación CGI utilizando varios controladores

siguiente es el código

$self->authen->config( 
DRIVER => [ 'DBI', 
    DBH   => $self->dbh, 
    TABLE  => 'user', 
    CONSTRAINTS => { 
    'user.username'  => '__CREDENTIAL_1__', 
    'MD5:user.password' => '__CREDENTIAL_2__' 
    }, 
], 

DRIVER => [ 'Authen::Simple::LDAP', 
    host => 'ldapad.company.com', 
    basedn => 'OU=XXX,OU=XX,DC=XXX,DC=XXX', 
binddn => 'CN=usename,OU=Users,OU=XXX,OU=AD,DC=XXX,DC=xxx', 
bindpw => 'secret', 
filter => '(cn=%s)', 
], 


CREDENTIALS => [ 'authen_username', 'authen_password' ], 
STORE    => 'Session', 
LOGOUT_RUNMODE  => 'logout', 
LOGIN_RUNMODE  => 'login', 
POST_LOGIN_RUNMODE => 'okay', 
RENDER_LOGIN   => \&my_login_form, 
); 

¿Cómo puedo hacer la aplicación compruebe el otro conductor no está autenticado con uno. En este momento, como era de esperar, es el controlador que se encuentra en la parte inferior el que funciona y ambos funcionan, dependiendo de cuál fue el último asignado.

Respuesta

2

Supongo que está utilizando CGI::Application::Plugin::Authentication. Creo que hay un pequeño problema en su código, que justifica el hecho de que solo el último de los dos funciona.

Su código es como:

 
$self->authen->config( 
    DRIVER => [ 'DBI', ... ], 
    DRIVER => [ 'Authen::Simple::LDAP', ... ], 
    CREDENTIALS => [ 'authen_username', 'authen_password' ], 
    STORE => 'Session', 
    # ... 
); 

pero $self->authen->config() recibe un hash. Por ejemplo, eche un vistazo a la distribución this example from the C::A::P::Authentication.

Al ser un hash, eso significa que la última entrada DRIVER sobrescribirá las anteriores. Creo que la solución es muy sencilla:

 
$self->authen->config( 
    DRIVER => [ 
     [ 'DBI', ... ], 
     [ 'Authen::Simple::LDAP', ... ], 
    ], 
    CREDENTIALS => [ 'authen_username', 'authen_password' ], 
    STORE => 'Session', 
    # ... 
); 

puede encontrar un ejemplo de esto en la documentación del módulo:

http://search.cpan.org/~silasmonk/CGI-Application-Plugin-Authentication/lib/CGI/Application/Plugin/Authentication.pm#config

0

¿Cómo hago que la aplicación compruebe el otro conductor no está autenticado con uno.

Me parece que desea comprobar si funciona más de un método de autenticación, en lugar del último que funciona. ¿Podría configurar 3 diferentes $ self-> authen-> config() e intentar iniciar sesión 3 veces diferentes? Utiliza un hash para rastrear los métodos que funcionan.

Cuestiones relacionadas