2010-06-25 12 views
5

Ho cercato di autenticare la mia applicazione CGI tramite 2 driver, uno che utilizza nome utente/password memorizzati nel database e altri che utilizzano la directory active ldap.Autenticazione applicazione CGI utilizzando più driver

seguito è riportato il codice di

$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, 
); 

Come faccio a fare controllare l'altro driver non è autenticato con un 'applicazione. Al momento, come previsto, è il driver elencato in fondo che funziona e lo fanno entrambi, a seconda di quale è stato assegnato per ultimo.

risposta

2

Suppongo che tu stia utilizzando CGI::Application::Plugin::Authentication. Penso che ci sia un piccolo problema nel codice, che giustifica il fatto che solo l'ultimo dei due lavori.

Il codice è simile:

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

ma $self->authen->config() prende un hash. Ad esempio, dai un'occhiata alla distribuzione this example from the C::A::P::Authentication.

Essendo un hash, ciò significa che l'ultima voce DRIVER sovrascriverà quelle precedenti. Credo che la soluzione è molto semplice:

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

È possibile trovare un esempio di questo nella documentazione del modulo:

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

0

Come faccio a fare controllare l'applicazione l'altro conducente non è autenticato con uno.

Mi sembra che tu voglia controllare se più di un metodo di autenticazione funziona, piuttosto che l'ultimo che funziona. Potresti configurare 3 diversi $ self-> authen-> config() e provare ad accedere 3 volte diverse? Usi un hash per tracciare i metodi che funzionano.

Problemi correlati