Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在symfony2中将角色动态分配给路径_Php_Security_Symfony_Acl - Fatal编程技术网

Php 在symfony2中将角色动态分配给路径

Php 在symfony2中将角色动态分配给路径,php,security,symfony,acl,Php,Security,Symfony,Acl,我正在尝试使用Symfony2应用程序中的现有用户/组/角色系统实现对某些URL的访问安全性。我正试图找出将其集成到Symfony的访问控制中的最佳方法(或者甚至可能将其装箱并手动管理访问控制) 问题是我有一个url(比如,/example),管理员组中的任何人现在都可以访问它。然后,这些组将为每个组分配更细粒度的角色。比如说,ADMIN组可能有EXAMPLE\u GET、EXAMPLE\u POST角色等等。但是其他组可能只有EXAMPLE\u GET,所以我需要获取用户对象,获取相关组,获取

我正在尝试使用Symfony2应用程序中的现有用户/组/角色系统实现对某些URL的访问安全性。我正试图找出将其集成到Symfony的访问控制中的最佳方法(或者甚至可能将其装箱并手动管理访问控制)

问题是我有一个url(比如,/example),管理员组中的任何人现在都可以访问它。然后,这些组将为每个组分配更细粒度的角色。比如说,ADMIN组可能有EXAMPLE\u GET、EXAMPLE\u POST角色等等。但是其他组可能只有EXAMPLE\u GET,所以我需要获取用户对象,获取相关组,获取角色,然后确定该用户是否可以使用他们尝试使用的http方法访问URL

最初,我只想手动将组名添加为角色(在symfony安全角色的上下文中),然后在用户对象中使用
getRoles()
,检查此人是否有权访问正确的组。然而,事实证明,我拥有的组列表并不是有限的,在任何时候都可以创建更多的组,所以如果可能的话,我需要避免硬编码这些组


有人能建议最好的解决方法吗?或者为我指出关于如何实现这一目标或类似目标的任何文档的方向?关键的一点是,我不能硬编码特定的安全组作为security.yml中的角色,因为人们需要能够创建更多的组,而不必手动将新组名添加到访问控制列表中。

听起来像是
VoterInterface
最适合这里:

我不会直接用防火墙(基于路径的方法)来实现这一点

只有通过保护您的资源不受security.yml中的防火墙的攻击,才需要普通用户登录。这将锁定任何未登录的用户

投票者实现将检查所有权限,然后返回是否授予

在控制器方法中,只需检查所需的授权,如下所示:

public function showAction($id)
    {
        // get a Post instance
        $post = ...;

        // keep in mind that this will call all registered security voters
        $this->denyAccessUnlessGranted('view', $post, 'Unauthorized access!');

        return new Response('<h1>'.$post->getName().'</h1>');
    }
公共功能显示($id)
{
//获取一个Post实例
$post=。。。;
//请记住,这将调用所有已注册的安全选民
$this->denyaccessunlessgrated('view',$post,'Unauthorized access!');
返回新的响应(''.$post->getName()');
}

谢谢-看来选民路线是最好的选择。ACL对于所需要的东西来说太过苛刻了,而将其进行后移植以支持数百万现有对象将是一场后勤噩梦