gpt4 book ai didi

symfony - 如何访问 Controller 中的防火墙配置?

转载 作者:行者123 更新时间:2023-12-01 15:58:55 32 4
gpt4 key购买 nike

我试图在我的 Controller 之一中获取防火墙信息(在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

现在在 Controller 中,我可以通过 $this->container->parameters['switch_user_role'] 获取它。

这个解决方案是不够的,因为如果我不想覆盖默认的 symfony 参数,switch_user_roleswitch_user_parameter 将不会被定义。

第二次测试

我尝试过的另一种方法是检索表示当前防火墙的对象实例。

我发现我可以使用 $this->container->get('security.context')->getToken()->getProviderKey() 在 Controller 中检索防火墙名称

但我被困在这里,因为我找不到我与这个值有什么关系。

那么在 Controller 中访问防火墙配置的最佳方式是什么?

最佳答案

可能是简单的读取配置文件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>

在 Controller 中使用它(使用服务'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

关于symfony - 如何访问 Controller 中的防火墙配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19610316/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com