在symfony2中为路径动态分配角色


Assigning roles to paths dynamically in symfony2

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

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

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

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

听起来VoterInterface最适合这里:http://symfony.com/doc/current/cookbook/security/voters.html

我不会尝试直接用防火墙(基于路径的方法)来做这件事

只需要通过在security.yml中使用防火墙保护您的资源不受IS_AUTHENTICATED_FULLY授予的影响来登录普通用户。这将锁定任何未登录的用户。

投票者实现将检查所有权限,然后返回授予或不返回。

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

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>');
    }