symfony2覆盖服务security.authentication.manager

时间:2012-06-05 09:36:27

标签: symfony

我想在Symfony \ Component \ Security \ Core \ Authentication \ AuthenticationProviderManager的函数authenticate()中添加一些代码。

我尝试创建安全捆绑包的子捆绑包。 我在这个包中重新定义了security.authentication.manager的服务,就像那个

    <!-- Authentication related services -->
    <service id="security.authentication.manager" class="%security.authentication.manager.class%" public="false">
        <argument type="collection" />
    </service>

但是当我重新启动页面时,框架会抛出异常:InvalidArgumentException:您必须至少添加一个身份验证提供程序。

我想这是因为在父包配置中创建了dependecies。

如果不重新定义整个安全捆绑包,我必须做些什么才能让它工作? 谢谢。

2 个答案:

答案 0 :(得分:0)

我想更好的是创建自己的处理程序。

  1. 您需要创建service
  2. 将其注册到service container
  3. 只需在security.yml
  4. 中设置处理程序即可
    form_login:
        success_handler: success_login_handler
        failure_handler: failure_login_handler
    logout:
        success_handler: success_logout_handler
    

答案 1 :(得分:0)

好的,我发现最好的方法是创建自己的工厂,扩展symfony2的formFactory

然后我必须创建我自己的AuthentificationProvider,扩展DaoAuthenticationProvider并将其声明为抽象服务。

然后通过createAuthProvider()方法在工厂内创建服务,并替换我们需要的参数。

protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
{
    $provider = 'acme.authentication.provider.dao.'.$id;
    $container
        ->setDefinition($provider, new DefinitionDecorator('acme.authentication.provider.dao'))
        ->replaceArgument(0, new Reference($userProviderId))//replace args on the service constructor
        ->replaceArgument(2, $id)
        ->addArgument(new Reference('acme.api'))//add some args to the service constructor
    ;

    return $provider;
}