2

http://symfony.com/doc/2.0/cookbook/security/custom_authentication_provider.htmlに基づいて独自の認証を作成しましたが、うまく機能します。

しかし、今は 2 つの認証プロバイダーが必要です。AuthenticationProviderManager はこれをサポートしていますが、セキュリティ ファクトリに 2 番目の認証プロバイダーを追加する方法がわかりません。

私のコード:

security.yml

  firewalls:
    wsse_secured:
      pattern:   /api/.*
      wsse:      true

WsseFactory.php

class WsseFactory implements SecurityFactoryInterface
{
    public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
    {
        $providerId = 'security.authentication.provider.wsse.'.$id;
        $container
            ->setDefinition(
                $providerId, 
                new DefinitionDecorator(
                    'wsse.security.authentication.provider'
                )
            )
            ->replaceArgument(
                0, 
                new Reference($userProvider)
            );

        $listenerId = 'security.authentication.listener.wsse.'.$id;
        $container->setDefinition(
            $listenerId, 
            new DefinitionDecorator(
                'wsse.security.authentication.listener'
            )
        );

        return array($providerId, $listenerId, $defaultEntryPoint);
    }

    public function getPosition()
    {
        return 'pre_auth';
    }

    public function getKey()
    {
        return 'wsse';
    }

    public function addConfiguration(NodeDefinition $node)
    {
    }
}

services.yml:

wsse.security.authentication.provider:
    class: LD\BinaryBackendBundle\Security\Authentication\Provider\WsseProvider
    arguments: ['', %kernel.cache_dir%/security/nonces]

wsse.security.authentication.listener:
    class:  LD\BinaryBackendBundle\Security\Firewall\WsseListener
    arguments: [@security.context, @security.authentication.manager, @logger]

ご覧のとおり、1 つの認証プロバイダーが登録されています。秒を追加するにはどうすればよいですか?

4

1 に答える 1

2

ファイアウォール構成に追加するだけで認証プロバイダーを追加できます。一方が失敗すると、もう一方に渡されます。

たとえば、私のアプリケーションでは、HWIOAuthBundle の form_login と oauth の両方を使用しています。 これが security.yml のファイアウォールです。

firewalls:
    main:
        pattern:                    ^/
        logout:                     true
        anonymous:                  true
        form_login:
            csrf_provider:          form.csrf_provider
            login_path:             /login
            check_path:             /login_check
            default_target_path:    /manager/
        logout:
            path:                   /logout
            target:                 /
        oauth:
            resource_owners:
                google:             /login/check-google
                facebook:           /login/check-facebook
                twitter:            /login/check-twitter
            default_target_path:    /manager/
            login_path:             /login
            failure_path:           /login
            oauth_user_provider:
                service: oauth_user_provider

そのため、URL に応じて、いずれかの認証プロバイダーを使用します。

于 2012-11-21T15:06:17.623 に答える