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

Assigning roles to paths dynamically in symfony2

我正在尝试使用 Symfony2 应用程序中现有的 users/groups/roles 系统实现对某些 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 授权,只需要普通用户登录即可。这将锁定任何未登录的用户。

选民实施将检查所有权限,然后 return 是否授予。

在您的控制器方法中,只需像这样检查所需的授权:

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