我想使用登录页面访问不同的防火墙,因此我需要获取有关我正在登录的防火墙的信息。 在我的控制器中我会使用
$this->container->get('security.context')->getToken()->getProviderKey()
但作为匿名用户,我无法访问getProviderKey方法。 我也可以解析
_security.xxx.target_path
获得xxx防火墙,但如果它存在,我正在寻找更通用的解决方案 有什么想法吗?
答案 0 :(得分:10)
从symfony 3.2开始,您现在可以使用以下命令获取当前的防火墙配置:
public function indexAction(Request $request)
{
$firewall = $this->container
->get('security.firewall.map')
->getFirewallConfig($request)
->getName();
}
参考:http://symfony.com/blog/new-in-symfony-3-2-firewall-config-class-and-profiler
答案 1 :(得分:1)
我最近对此进行了一些研究,以便我可以在XACML请求中将此信息作为环境的一部分发送。
据我所知GitHub这样的问题:
https://github.com/symfony/symfony/issues/14435
目前无法可靠地从Symfony获取信息,除了在链接问题上建议的脏编译器传递黑客。它确实出现在关于这些问题的对话中,他们正在努力使其可用,但是,状态仍然是开放的,所以我们必须耐心等待它的提供。
答案 2 :(得分:1)
对于Symfony 3.4,我这样做是为了避免引用非公共的“ security.firewall.map”服务:
$firewallName = null;
if (($firewallContext = trim($request->attributes->get("_firewall_context", null))) && (false !== ($firewallContextNameSplit = strrpos($firewallContext, ".")))) {
$firewallName = substr($firewallContext, $firewallContextNameSplit + 1);
}
(在3.4上引用“ security.firewall.map”将引发异常。)
编辑:这不适用于自定义异常控制器功能。
答案 3 :(得分:0)
@Adambean的回答很优雅,但我将其写成单行:
$firewallName = array_slice(explode('.', trim($request->attributes->get('_firewall_context'))), -1)[0];
区别在于$firewallName
将始终是字符串(可以为空)。
另外,请注意,此答案(如@Adambean的答案)不适用于名称中带有点的防火墙。