Php Symfony2获取位于security.yml中的访问控制参数

Php Symfony2获取位于security.yml中的访问控制参数,php,security,symfony,service,access-control,Php,Security,Symfony,Service,Access Control,我正在尝试获取位于security.yml中的访问控制参数,作为自定义服务中的数组 就像获取role_hierarchy参数一样,我认为可以使用以下代码: $accessParameters=$this->container->getParameter('security.access_control'); 不幸的是,情况并非如此。有人能告诉我如何获取参数吗?无法从容器中获取access\u control参数。 这是因为此参数将创建一个将在中稍后给出的方式进行注册的对象,然后将其保留下来,而

我正在尝试获取位于security.yml中的访问控制参数,作为自定义服务中的数组

就像获取role_hierarchy参数一样,我认为可以使用以下代码:

$accessParameters=$this->container->getParameter('security.access_control');

不幸的是,情况并非如此。有人能告诉我如何获取参数吗?

无法从容器中获取
access\u control
参数。
这是因为此参数将创建一个将在中稍后给出的方式进行注册的对象,然后将其保留下来,而不将其注册到容器中

你可以尝试一些黑客手段,通过让他们像

$context  = $this->get("security.firewall.map.context.main")->getContext();
$listener = $context[0][5];
// Do reflection on "map" private member
但这是一种丑陋的解决方案

关于如何获取它们,我可以看到的另一种方法是再次解析安全文件

use Symfony\Component\Yaml\Yaml;

$file   = sprintf("%s/config/security.yml", $this->container->getParameter('kernel.root_dir'));
$parsed = Yaml::parse(file_get_contents($file));

$access = $parsed['security']['access_control'];
如果要将此配置注册到服务中,可以执行以下操作

services.yml

Acme\FooBundle\ConfigProvider

Acme\FooBundle\MyService


Necro,但仍然相关。这是对Touki上述答案的改进,我们不重新分析访问控制定义,而是使用已配置的安全令牌、防火墙和访问映射来计算答案

../services.yml

src/My/Application/AuthenticationBundle/Security/AccessControlHelper.php

declare(严格类型=1);
名称空间My\Application\AuthenticationBundle\Security;
使用Symfony\Component\HttpFoundation\Request;
使用Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
使用Symfony\Component\Security\Core\securitycontenterface;
使用Symfony\Component\Security\Http\accessmainterface;
使用Symfony\Component\Security\Http\Firewall\AccessListener;
使用Symfony\Component\Security\Http\firewallmainterface;
类AccessControlHelper
{
/**
*@var securitycontenterface
*/
受保护的$securityContext;
/**
*@var FirewallMapInterface
*/
受保护的$firewallMap;
/**
*@var AccessDecisionManagerInterface
*/
受保护的$accessDecisionManager;
/**
*@var accessmainterface
*/
受保护的$accessMap;
公共函数构造(
SecurityContextInterface$securityContext,
FirewallMapInterface$firewallMap,
accessDecisionManager接口$accessDecisionManager,
AccessMapInterface$accessMap
)
{
$this->securityContext=$securityContext;
$this->firewallMap=$firewallMap;
$this->accessDecisionManager=$accessDecisionManager;
$this->accessMap=$accessMap;
}
公共功能请求可访问(请求$Request):bool
{
$token=$this->securityContext->getToken();
if(!$token | | false=$token->isAuthenticated()){
返回false;
}
list($listeners)=$this->firewallMap->getListeners($request);
如果($listeners){
foreach($listeners作为$listener){
if($listener instanceof AccessListener){
/**
*这里的逻辑受到AccessListener->handle(…)方法的启发。
*/
list($attributes)=$this->accessMap->getPatterns($request);
如果(null==$attributes){
继续;
}
返回布尔瓦尔($this->accessDecisionManager->decise($token,$attributes,$request));
}
}
}
返回true;
}
公共函数ISURIAccessable(字符串$uri)
{
返回$this->isRequestAccessible(请求::创建($uri));
}
}
示例用法:

使用My\Application\AuthenticationBundle\Security\AccessControlHelper;
使用Symfony\Component\DependencyInjection\ContainerInterface;
使用Symfony\Component\HttpFoundation\Request;
$container=…;//@var容器接口
$accessControlHelper=$container->get(accessControlHelper::class);
$accessControlHelper->isRequestAccessible(新请求(“/foo”);
$accessControlHelper->isuriccessable(“/foo”);

谢谢你的回答。虽然它并不漂亮,但如果无法使用容器获取参数,它仍然是最佳选择。请注意,如果在prod env中清除缓存,然后在不重新清除缓存的情况下修改文件,则可能不准确。我不知道这一点。谢谢你的提醒。
services:
    acme.config_provider:
        class: Acme\FooBundle\ConfigProvider
        arguments:
            - "%kernel.root_dir%"
    acme.my_service:
        class: Acme\FooBundle\MyService
        arguments:
            - "@acme.config_provider"
use Symfony\Component\Yaml\Yaml;

class ConfigProvider
{
    protected $rootDir;

    public function __construct($rootDir)
    {
        $this->rootDir = $rootDir;
    }

    public function getConfiguration()
    {
        $file = sprintf(
            "%s/config/security.yml",
            $this->rootDir
        );
        $parsed = Yaml::parse(file_get_contents($file));

        return $parsed['security']['access_control'];
    }
}
class MyService
{
    protected $provider;

    public function __construct(ConfigProvider $provider)
    {
        $this->provider = $provider;
    }

    public function doAction()
    {
        $access = $this->provider->getConfiguration();

        foreach ($access as $line) {
            // ...
        }
    }
}
...

My\Application\AuthenticationBundle\Security\AccessControlHelper:
    class: My\Application\AuthenticationBundle\Security\AccessControlHelper
    arguments:
        $securityContext: "@security.context"
        $firewall: '@security.firewall.map'
        $accessDecisionManager: '@security.access.decision_manager'
        $accessMap: '@security.access_map'

...