fos user:即使用户只有一个角色,也允许路由到多个角色

fre*_*dev 3 security authorization roles symfony fosuserbundle

在我的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');
  }
}
Run Code Online (Sandbox Code Playgroud)

为了测试视图渲染,我创建了一个角色为ROLE_USER_TWO的用户.当我渲染视图时,我有这个错误:

表达式"has_role('ROLE_USER_ONE','ROLE_USER_TWO','ROLE_USER_THREE')"拒绝访问.

据我所知,Symfony期望用户拥有所有角色,如何在我的控制器注释和控制器代码中允许对用户进行视图访问?

Ema*_*ter 6

您不必尝试将每个角色都放在同一个has_role()语句中,而是必须将它们连接起来or:

@Security("has_role('ROLE_USER_ONE') or has_role('ROLE_USER_TWO') or has_role('ROLE_USER_THREE')")
Run Code Online (Sandbox Code Playgroud)

这样,您实际上检查当前用户是否至少具有其中一个角色而不是所有角色.