1

我正在 symfony2 中进行 wsse 身份验证。T 完美地遵循了他们的步骤,然后我在 helloWorld 函数上进行了尝试:

public function HelloWorldAction()
{
    return new Response("Hello World");
}

它的路线: http://localhost/Symfony/web/app_dev.php/api/helloworld

但我收到此错误:

ServiceCircularReferenceException in CheckCircularReferencesPass.php line 69:
Circular reference detected for service "security.authentication.manager", path: "security.authentication.manager -> security.authentication.provider.wsse.wsse_secured -> security.authentication.manager".

我已经仔细检查了我的 services.yml 文件是否有任何错误,并且我已经在网上搜索了 4 小时以获得答案,但我仍然卡住了。

这是 bundle 的 services.yml:

services:
    wsse.security.authentication.provider:
        class: OBCarsTest2Bundle\Security\Authentication\Provider\WsseProvider
        arguments: ["", "%kernel.cache_dir%/security/nonces"]
        parent: security.authentication.listener.abstract #this key is defined in security_listeners.xml
        abstract: true

    wsse.security.authentication.listener:
        class: OBCarsTest2Bundle\Security\Firewall\WsseListener
        arguments: ["@security.token_storage", "@security.authentication.manager"]

    security.authentication.factory.wsse:
        class:  OBCarsTest2Bundle\DependencyInjection\Security\Factory\WsseFactory
        tags:
            - { name: security.listener.factory }

那是我的wsse工厂:

<?php
namespace OBCarsTest2Bundle\DependencyInjection\Security\Factory;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface;

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))
            ->replaceArgument(2, $config['lifetime']);

        $listenerId = 'security.authentication.listener.wsse.'.$id;
        $listener = $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)
    {
      $node
        ->children()
        ->scalarNode('lifetime')->defaultValue(300)
        ->end();
    }
}
4

1 回答 1

1

尝试通过 setter 注入 wsse.security.authentication.provider。

在您的 WsseProvider 中编写一个 setUserProvider 并通过构造函数删除注入。

在您的 WsseFactory 中:

$container
        ->setDefinition($providerId,
          new DefinitionDecorator('wsse.security.authentication.provider'))
        ->replaceArgument(0, $config['lifetime'])
        ->addMethodCall('setUserProvider', array(new Reference($userProvider)));
于 2015-06-10T15:46:59.763 回答