7

silex のドキュメントを使用して、LDAP 認証用のカスタム認証プロバイダーを作成しようとしています -カスタム認証プロバイダーの定義

しかし、調べてみると$app['security.authentication_providers']、2 つのプロバイダーがあります。私が定義App\LdapAuthenticationProviderしたものと Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider

App\LdapUserProvider::loadUserByUsername()そして、クラス DaoAuthenticationProvider からの呼び出しがあるため、ユーザーを承認しようとするとエラーが発生します。

$app['security.authentication_providers']LDAP プロバイダーが loadUserByUsername を呼び出さないため、プロバイダーが 1 つしかない場合、エラーは発生しないはずです。

ここにダンプがあります$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)

それで、なぜ余分なプロバイダーがあるのか​​ 、どうすればそれを取り除くことができるのか、誰かが知っていますか?

applicationLdapAuthenticationListener、およびLdapAuthenticationProviderをブートストラップするためのコードがあります。

4

1 に答える 1

2

問題は解決しました。

LdapAuthenticationListenerクラスを symfony2で拡張し、bootstarpUsernamePasswordFormAuthenticationListenerを次のように変更しました。

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

認証方法でトークンを上書きするカスタム認証リスナーが必要であり、認証プロバイダーはユーザー名とパスワードでユーザープロバイダーからユーザーを取得します$this->userProvider->loadUserByUsernameAndPassword($usernam, $password)

于 2013-05-24T08:00:02.467 に答える