2013-05-23 19 views
7

Provo a scrivere provider di autenticazione personalizzati per l'autenticazione LDAP utilizzando la documentazione silex - Defining a custom Authentication Provider.Provider di autenticazione personalizzato nell'applicazione silex

Ma se guardo su $app['security.authentication_providers'] ci sono due provider. Uno che ho definito App\LdapAuthenticationProvider e uno Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider

E quando cerco di autorizzazione all'utente ottengo l'errore perché c'è una chiamata di un App\LdapUserProvider::loadUserByUsername() dalla classe DaoAuthenticationProvider.

Se in $app['security.authentication_providers'] avrei un solo provider, non dovrei ricevere l'errore perché il mio provider LDAP non chiama loadUserByUsername.

Ecco discarica di $app['security.authentication_providers']

array (size=2) 
    0 => object(App\LdapAuthenticationProvider)[194] 
    private 'userProvider' => 
     object(App\LdapUserProvider)[176] 
     private 'ldap' => resource(57, ldap link) 
     private 'defaultRoles' => 
      array (size=1) 
      ... 
    private 'providerKey' => string 'default' (length=7) 
    1 => object(Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider)[195] 
    private 'encoderFactory' => 
     object(Symfony\Component\Security\Core\Encoder\EncoderFactory)[197] 
     private 'encoders' => 
      array (size=1) 
      ... 
    private 'userProvider' => 
     object(App\LdapUserProvider)[176] 
     private 'ldap' => resource(57, ldap link) 
     private 'defaultRoles' => 
      array (size=1) 
      ... 
    private 'hideUserNotFoundExceptions' (Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider) => boolean true 
    private 'userChecker' (Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider) => object(Symfony\Component\Security\Core\User\UserChecker)[196] 
    private 'providerKey' (Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider) => string 'default' (length=7) 

Così, qualcuno sa il motivo per cui ci sono provider di extra e come posso sbarazzarsi di esso?

Ci sono codici per bootstraping application, LdapAuthenticationListener e LdapAuthenticationProvider.

risposta

2

Il problema è risolto.

Ho appena esteso la mia classe LdapAuthenticationListener con Symfony2 UsernamePasswordFormAuthenticationListener e cambiare bootstarp come questo:

$app['security.authentication_listener.factory.ldap'] = $app->protect(
    function ($name, $options) use ($app) { 
     $app['security.authentication_provider.'.$name.'.ldap'] = $app->share(
      function() use ($app) { 
       return new LdapAuthenticationProvider(
        $app['security.user_provider.default'], 
        'ldap' 
       ); 
      } 
     ); 

     $app['security.authentication_listener.'.$name.'.ldap'] = $app->share(
      function() use ($app, $name, $options) { 
       $app['security.authentication.success_handler.'.$name] = 
        $app['security.authentication.success_handler._proto']($name, $options); 
       $app['security.authentication.failure_handler.'.$name] = 
        $app['security.authentication.failure_handler._proto']($name, $options); 

       return new LdapAuthenticationListener(
        $app['security'], 
        $app['security.authentication_manager'], 
        $app['security.session_strategy'], 
        $app['security.http_utils'], 
        $name, 
        $app['security.authentication.success_handler.'.$name], 
        $app['security.authentication.failure_handler.'.$name], 
        array_merge(
         array(
          'check_path' => '/admin/login_check', 
          'login_path' => '/login', 
         ), 
         $options 
        ), 
        $app['logger'], 
        $app['dispatcher'], 
        null 
       ); 
      } 
     ); 

     return array(
      'security.authentication_provider.'.$name.'.ldap', 
      'security.authentication_listener.'.$name.'.ldap', 
      null, 
      'pre_auth' 
     ); 
    } 

ho bisogno di autenticazione listener personalizzato per sovrascrivere token nel metodo di autenticazione e provider di autenticazione utente da recuperare fornitore utente tramite nome utente e la password $this->userProvider->loadUserByUsernameAndPassword($usernam, $password)

+0

Tuttavia, non è ancora possibile capire perché '' $ app ['security.authentication_providers'] '' ha due provider. – vansanblch

+0

puoi pubblicare il codice finale che hai inserito? – heapOverflow

+0

Purtroppo non posso. Questo progetto è stato ritirato ora e non ho accesso ad esso. Ma l'idea principale era scrivere LdapAuthenticationListener corretto che ho archiviato estendendolo da UsernamePasswordFormAuthenticationListener. E c'è un codice in un bootstrap per registrare un nuovo factory per gestire l'autenticazione con ldap. Dai un'occhiata anche al codice su pastebin, linku potrebbe essere trovato nel primissimo commento. Penso di non aver modificato troppo il codice in queste classi. – vansanblch

Problemi correlati