我需要在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')));
但我宁愿以更好的方式做到这一点。
所以,我有几个问题:
答案 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