我正在尝试使用Symfony2应用中的现有用户/组/角色系统来实现对某些URL的访问安全性。我试图弄清楚将其集成到Symfony的access_control中的最佳方法(或者甚至可能将其捆绑并手动管理访问控制)。
问题是我有一个url(例如/ example),ADMIN组中的任何人都可以访问它。然后,这些组具有分配给每个组的更细粒度的角色。因此,例如,ADMIN组可能具有EXAMPLE_GET,EXAMPLE_POST角色等。但是其他组可能只有EXAMPLE_GET,因此我需要获取User对象,获取关联的组,获取角色,然后确定该用户是否可以使用他们试图使用的http方法访问URL。
最初,我想手动添加组名作为角色(在symfony安全角色的上下文中),然后在用户对象中使用getRoles()
来检查该人是否有权访问正确的组来访问它。然而,事实证明我所拥有的组的列表不是有限的,并且可以在任何时候创建更多组,所以我需要避免在可能的情况下对组进行硬编码。
有人能建议采取最佳方法吗?或者指出我关于如何实现这个或类似的任何文档的方向?关键点是我无法将特定安全组硬编码为security.yml中的角色,因为人们需要能够创建更多组而无需手动将新组名添加到access_control列表。
答案 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>');
}