在我的symfony项目中,使用FOS包,我有4个这样的角色:
ROLE_USER_ONE
ROLE_USER_TWO
ROLE_USER_THREE
他们无法访问相同的视图,但一个视图除外。这是我的渲染视图的控制器:
/**
* @Security("has_role('ROLE_USER_ONE', 'ROLE_USER_TWO', 'ROLE_USER_THREE')")
* @Route("/add-note", name="add_user_note")
* @Method({"GET"})
*/
public function addNoteToUserAction()
{
$securityContext = $this->container->get('security.authorization_checker');
if ($securityContext->isGranted('ROLE_USER_ONE', 'ROLE_USER_TWO', 'ROLE_USER_THREE')) {
/* ... some persist datas and process here ... */
return $this->render('MyBundle:NoteUser:addNote.html.twig', array(
));
} else {
throw new \Exception('You have no right to access this page');
}
}
为了测试视图渲染,我创建了一个角色为ROLE_USER_TWO的用户。当我渲染视图时,我有这个错误:
Expression" has_role(' ROLE_USER_ONE',' ROLE_USER_TWO', ' ROLE_USER_THREE')"拒绝访问。
据我所知,Symfony期望用户拥有所有角色,如何在我的控制器注释和控制器代码中允许对用户进行视图访问,而不是其中一个角色?
答案 0 :(得分:6)
不必尝试将每个角色都放在同一个has_role()
语句中,而是必须将它们与or
连接起来:
@Security("has_role('ROLE_USER_ONE') or has_role('ROLE_USER_TWO') or has_role('ROLE_USER_THREE')")
这样,您实际上是在检查当前用户是否至少拥有其中一个角色而不是所有角色。
答案 1 :(得分:2)
我想你正在寻找role hierarchy。您的配置将如下:
security:
# ...
role_hierarchy:
ROLE_USER_ONE : ROLE_USER_BASE
ROLE_USER_TWO : ROLE_USER_BASE
ROLE_USER_THREE : ROLE_USER_BASE
具有ROLE_USER_ONE
角色的用户也有角色ROLE_USER_BASE
等。然后,在您的控制器中,您只需要检查ROLE_USER_BASE
:
/**
* @Security("has_role('ROLE_USER_BASE')")
* @Route("/add-note", name="add_user_note")
* @Method({"GET"})
*/
public function addNoteToUserAction()