2015-06-10 18 views
1

我正在开发symfony2中的wsse身份验证。牛逼跟着他们的脚步完美,那么我想它一个HelloWorld函数:CheckCircularReferencesPass.php中的ServiceCircularReferenceException

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文件中有任何错误,我一直在网上搜索4h以获得答案,但我仍然陷入困境。

这捆的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(); 
    } 
} 

回答

1

尝试通过二传手注入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))); 
+0

这是工作,当我第一次尝试你的方法,但后来它给了我同样的方法。已经有4天了,没有结果。 – daroum

相关问题