2013-05-23 9 views
7

Próbuję napisać niestandardowy dostawca uwierzytelniania dla uwierzytelniania LDAP, korzystając z dokumentacji Silex - Defining a custom Authentication Provider.Niestandardowy dostawca uwierzytelniania w aplikacji silex

Ale jeśli spojrzę w $app['security.authentication_providers'], są dwaj dostawcy. Jeden, który zdefiniowałem App\LdapAuthenticationProvider i jeden Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider

I gdy próbuję zezwolić użytkownikowi otrzymuję błąd, ponieważ nie ma połączenia z App\LdapUserProvider::loadUserByUsername() z klasy DaoAuthenticationProvider.

Jeśli miałbym tylko jednego dostawcę w $app['security.authentication_providers'] Myślę, że nie powinienem dostać błędu, ponieważ mój dostawca LDAP nie wywołuje loadUserByUsername.

Oto zrzut $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) 

tak, to czy ktoś wie, dlaczego istnieje dodatkowy dostawca i jak mogę się go pozbyć?

Istnieją kody dla bootstraping application, LdapAuthenticationListener i LdapAuthenticationProvider.

Odpowiedz

2

Problem został rozwiązany.

Właśnie przedłużony mój LdapAuthenticationListener klasę z Symfony2 UsernamePasswordFormAuthenticationListener i zmienić bootstarp tak:

$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' 
     ); 
    } 

muszę niestandardowego uwierzytelniania słuchacza nadpisać token metody uwierzytelniania i dostawcy uwierzytelniania odzyskać użytkownika z dostawcą użytkownika przez nazwę użytkownika i hasło $this->userProvider->loadUserByUsernameAndPassword($usernam, $password)

+0

Jednak nadal nie można zrozumieć, dlaczego '' $ app ['security.authentication_providers'] '' ma dwóch dostawców. – vansanblch

+0

Czy możesz opublikować ostateczny kod, który zrobiłeś? – heapOverflow

+0

Niestety nie mogę. Ten projekt został wycofany i nie mam do niego dostępu. Ale głównym pomysłem było napisanie poprawnej LdapAuthenticationListener, którą zarchiwizowałem poprzez rozszerzenie jej z UsernamePasswordFormAuthenticationListener. I istnieje kod w bootstrapie, aby zarejestrować nową fabrykę do obsługi uwierzytelniania LDAP. Spójrz również na kod w pastebin, linku można znaleźć w pierwszym komentarzu. Myślę, że nie zmieniłem zbytnio kodu w tych klasach. – vansanblch

Powiązane problemy