symfony2从服务容器中获取用户提供程序

时间:2015-09-22 07:07:22

标签: security symfony

我需要在Symfony2中的控制器中获取用户提供程序。 我有多个user_providers,其中1个链提供商链接这些。

在容器中定义了一个名为security.user.provider.concrete.XXX的服务(其中XXX是您在security.yml中指定的),但该服务被标记为私有。

我设法在我的捆绑包的扩展类中定义了一个别名:

    $container->setAlias('my_bundle.user.provider', new Alias('security.user.provider.concrete.XXX')));

但我宁愿以更好的方式做到这一点。

所以,我有几个问题:

  • 是否有可用于获取特定用户提供商的服务?哪一个?
  • 如果没有,是否有一种简单的方法(在预编译器传递或其他东西中)获取所有用户提供者名称并简单地为这些服务创建别名?

2 个答案:

答案 0 :(得分:1)

我稍微使用了配置,并想出如何为使用CompilerPass配置的任何提供商一般创建别名:

<?php
namespace MyBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class TestCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $securityConfig = $container->getExtensionConfig('security');
        foreach ($securityConfig[0]['providers'] as $providerName => $providerConfig) {
            $container->setAlias('my_security.provider.' . $providerName, new Alias('security.user.provider.concrete.' . $providerName));
        }
    }
}

将以下内容添加到Bundle类:

public function build(ContainerBuilder $container) {
    // call parent
    parent::build($container);

    // run extra compilerPass
    $container->addCompilerPass(new TestCompilerPass());
}

这将为每个存在的UserProvider创建一个别名。它将在密钥my_security.provider.XXX下提供,其中XXX是security.yml中配置的名称。

但我不确定为什么配置前面加上一个键为0的数组。 我也不确定这是不是一个好方法。如果没有更好的结果,我将使用这个解决方案。

答案 1 :(得分:0)

您可以通过当前登录用户防火墙名称获取特定提供商:

$token = $this->securityContext->getToken();
$providerKey = $token->getProviderKey(); // secured_area / firewall name

您可以在此处查看:https://codedump.io/share/unA0SxVxuP9v