我正试图使用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>');
}