2013-05-23 23 views
7

Silex belgelerini kullanarak LDAP kimlik doğrulaması için özel kimlik doğrulama sağlayıcısı yazmayı deniyorum - Defining a custom Authentication Provider.Silex uygulamasında özel kimlik doğrulama sağlayıcısı

Ancak, $app['security.authentication_providers']'a bakarsanız iki sağlayıcı vardır. Ben App\LdapAuthenticationProvider tanımlanmış Bir ve Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider

biri Ve kullanıcıyı yetkilendirmek çalıştığınızda sınıf DaoAuthenticationProvider bir App\LdapUserProvider::loadUserByUsername() çağrısı olduğundan hatası alıyorum.

$app['security.authentication_providers'] yalnızca bir sağlayıcı olurdu Ben LDAP sağlayıcım loadUserByUsername çağrısı çünkü hata almam gerektiğini düşünüyorum. İşte

Yani $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) 

dökümü, ekstra sağlayıcı vardır neden kimse biliyor mu ve nasıl ondan kurtulmak olabilir mi?

bootstraping application, LdapAuthenticationListener ve LdapAuthenticationProvider için kod vardır.

cevap

2

Sorun çözüldü.

Sadece Symfony2'de UsernamePasswordFormAuthenticationListener ile benim LdapAuthenticationListener sınıf genişletilmiş ve böyle bootstarp değiştirmek ettik:

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

Ben kimlik doğrulama yöntemi ve kimlik doğrulama sağlayıcısı jetonun üzerine yazmak için özel kimlik doğrulama dinleyici ihtiyaç kullanıcı adı ile kullanıcı sağlayıcısından kullanıcı almak ve Parola $this->userProvider->loadUserByUsernameAndPassword($usernam, $password)

+0

Yine de, neden '' $ app ['security.authentication_providers'] '' ın iki sağlayıcıya sahip olduğunu anlayamıyor. – vansanblch

+0

Yaptığınız son kodu gönderebilir misiniz? – heapOverflow

+0

Maalesef yapamam. Bu proje şimdi çekildi ve ona erişimim yok. Ancak asıl fikir, UsernamePasswordFormAuthenticationListener'den genişleterek arşivlediğim doğru LdapAuthenticationListener'ı yazmaktı. Ve ldap kimlik doğrulamasını işlemek için yeni fabrika kaydetmek için bir bootstrap bir kod var. Ayrıca pastebin koduna bir göz atın, linku ilk yorumda bulunabilir. Sanırım bu derslerde kodları çok fazla değiştirmedim. – vansanblch

İlgili konular