Security symfony2在登录页面上获取防火墙名称

Security symfony2在登录页面上获取防火墙名称,security,symfony,login,firewall,Security,Symfony,Login,Firewall,我想使用一个登录页面来访问不同的防火墙,所以我需要获取有关我正在登录的防火墙的信息。 在我的控制器中,我会使用 $this->container->get('security.context')->getToken()->getProviderKey() 但作为一个匿名用户,我没有访问getProviderKey方法的权限。 我还可以解析 _security.xxx.target_path 要获得xxx防火墙,但我正在寻找一个更通用的解决方案,如果它存在的话。 有什

我想使用一个登录页面来访问不同的防火墙,所以我需要获取有关我正在登录的防火墙的信息。 在我的控制器中,我会使用

$this->container->get('security.context')->getToken()->getProviderKey()
但作为一个匿名用户,我没有访问getProviderKey方法的权限。 我还可以解析

_security.xxx.target_path 
要获得xxx防火墙,但我正在寻找一个更通用的解决方案,如果它存在的话。

有什么想法吗?

最近我自己也在做一些研究,这样我就可以在XACML请求中发送这些信息,作为环境的一部分

据我所知,GitHub的问题如下:


目前没有可靠的方法从Symfony中获取信息,除了在链接问题上建议的脏编译器密码破解。从关于这些问题的对话中确实可以看出,他们正在努力使其可用,但是,状态仍处于打开状态,因此我们必须耐心等待它的提供。

从symfony 3.2开始,您现在可以通过以下方式获得当前的防火墙配置:

public function indexAction(Request $request)
{
    $firewall = $this->container
        ->get('security.firewall.map')
        ->getFirewallConfig($request)
        ->getName();
}

参考:

对于Symfony 3.4,我写这篇文章是为了避免引用非公共的“security.firewall.map”服务:

(在3.4中引用“security.firewall.map”将引发异常。)


编辑:这在自定义异常控制器函数中不起作用。

@Adambean的回答非常优雅,但我将它写成一行:

$firewallName = array_slice(explode('.', trim($request->attributes->get('_firewall_context'))), -1)[0];
区别在于,
$firewallName
将始终是一个字符串(可能为空)


另外,请注意,这个答案(比如@Adambean)不适用于名称中带有点的防火墙。

当然,这是出于安全考虑;但如果您只需要
target_path
,您可以在配置文件中定义一个单独的参数,并在控制器中使用它。我需要提供程序密钥来引导许多不同的参数。老实说,我不明白为什么匿名令牌不能获得提供者密钥。防火墙外的页面根本没有提供程序,但防火墙内的页面,即使经过匿名身份验证(比如登录页面),仍然在防火墙下。引用服务“security.firewall.map”将不再在Symfony 3.4中工作,因为服务不是公共的。我得到以下信息:未捕获的PHP异常Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:“the”security.firewall.map“在编译容器时,服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖注入。”在vendor/symfony/symfony/src/symfony/Component/DependencyInjection/container.php第337Yep行,从symfony 3.4开始,您应该使用适当的依赖注入,而不是注入服务容器(在symfony 4.2中,Controller类已被弃用,因此您将被迫连接控制器在5.0中实际需要的服务)。
$firewallName = array_slice(explode('.', trim($request->attributes->get('_firewall_context'))), -1)[0];