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

时间:2014-04-17 08:39:45

标签: security symfony login firewall

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

$this->container->get('security.context')->getToken()->getProviderKey()

但作为匿名用户,我无法访问getProviderKey方法。 我也可以解析

_security.xxx.target_path 

获得xxx防火墙,但如果它存在,我正在寻找更通用的解决方案 有什么想法吗?

4 个答案:

答案 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的答案)不适用于名称中带有点的防火墙。