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

时间:2015-11-06 14:46:45

标签: php security symfony acl

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这听起来像VoterInterface woulde最适合这里: 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>');
    }