我正在尝试在我的某个控制器中获取firewall
信息(在security.yml
中定义)。
我需要的部分是switch_user
配置:
switch_user: { role: ROLE_ADMIN, parameter: _abagnale }
目标是在管理部分创建一个链接,允许管理员一键切换用户。
首次测试
我试图将此值定义为参数。
security:
# ...
switch_user: { role: %switch_user_role%, parameter: %switch_user_parameter% }
parameters:
switch_user_role: ROLE_ADMIN
switch_user_parameter: _abagnale
现在在控制器中,我可以使用$this->container->parameters['switch_user_role']
来获取它。
此解决方案还不够,因为如果我不想覆盖默认的symfony参数,则不会定义switch_user_role
和switch_user_parameter
。
第二次测试
我尝试过的另一种方法是检索代表当前防火墙的对象实例。
我发现我可以使用$this->container->get('security.context')->getToken()->getProviderKey()
但我被困在这里,因为我无法找到与此值有关的事情。
那么在控制器中访问防火墙配置的最佳方法是什么?
答案 0 :(得分:1)
可能是简单的读取配置文件security.yml?
<强> UPD 强>:确定
我认为使用DI是完成任务的简单方法。 对不起,我的Symfony 2.1代码。我无法检查它在2.3中是如何工作的,但我认为它没有对这种逻辑进行全局更改。
所有身份验证事件都由一些侦听器处理。例如,Symfony\Component\Security\Http\Firewall
命名空间。
对于switch_user事件,它是Symfony\Component\Security\Http\Firewall\SwitchUserListener
。扩展它并且开心。
代码:
鉴于security.yml
:
firewalls:
secured_area_2:
switch_user:
provider: ~
parameter: _switch_useraaaaa
role: ROLE_ALLOWED_TO_SWITCH
我创造了我的听众。
<?php
namespace Nonlux\TestBundle\Symfony;
use Symfony\Component\Security\Http\Firewall\SwitchUserListener as BaseListener;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
use Psr\Log\LoggerInterface;
class SwitchUserListener extends BaseListener
{
private $usernameParameter;
private $role;
public function __construct(SecurityContextInterface $securityContext, UserProviderInterface $provider, UserCheckerInterface $userChecker, $providerKey, AccessDecisionManagerInterface $accessDecisionManager, LoggerInterface $logger = null, $usernameParameter = '_switch_user', $role = 'ROLE_ALLOWED_TO_SWITCH', EventDispatcherInterface $dispatcher = null)
{
$this->usernameParameter = $usernameParameter;
$this->role = $role;
parent::__construct($securityContext, $provider,$userChecker, $providerKey, $accessDecisionManager, $logger, $usernameParameter, $role, $dispatcher);
}
public function getUsernameParameter(){
return $this->usernameParameter;
}
public function getRole(){
return $this->role;
}
}
我改变了标准听众。
# app/config/config.yml
imports:
...
- { resource: services.xml }
...
重要!默认情况下,安全身份验证侦听器具有public = "false"
参数。但我们不这样做,而且我们可以在容器中看到儿童听众。
如果你不喜欢这样做。你可以创建可以存储所需数据的服务,从你的听众那里填充它并发挥你的魔力。
<!-- app/config/services.xml -->
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="nonlux.security.authentication.switchuser_listener.class">Nonlux\TestBundle\Symfony\SwitchUserListener</parameter>
</parameters>
<services>
<service id="security.authentication.switchuser_listener" class="%nonlux.security.authentication.switchuser_listener.class%" abstract="true">
<tag name="monolog.logger" channel="security" />
<argument type="service" id="security.context" />
<argument /> <!-- User Provider -->
<argument type="service" id="security.user_checker" />
<argument /> <!-- Provider Key -->
<argument type="service" id="security.access.decision_manager" />
<argument type="service" id="logger" on-invalid="null" />
<argument>_switch_user</argument>
<argument>ROLE_ALLOWED_TO_SWITCH</argument>
<argument type="service" id="event_dispatcher" on-invalid="null"/>
</service>
</services>
</container>
在controler中使用它(使用服务'security.authentication.switchuser_listener.you_firewall_name')
<?php
namespace Nonlux\TestBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
class DefaultController extends Controller
{
/**
* @Route("/switch", name="switch")
* @Template()
*/
public function switchAction()
{
$name=$this->get("security.authentication.switchuser_listener.secured_area_2")->getUsernameParameter();
return array('name' => $name);
}
}
请参阅页面中的魔法并感到高兴。
Hello _switch_useraaaaa