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

fos user: allow route to many roles even if user have just one role

在我的 symfony 项目中,使用 FOS 包,我有 4 个这样的角色:

他们无法访问相同的视图,只有一个视图除外。这是我用于渲染视图的控制器:

/**
 * @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')" denied access.

据我了解,Symfony 期望用户拥有所有角色,我如何才能允许视图访问至少是我的控制器注释和控制器代码中的这些角色之一的用户?

我想您正在寻找 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()

与其尝试将每个角色放入同一个 has_role() 语句,不如将它们与 or 连接起来,如下所示:

@Security("has_role('ROLE_USER_ONE') or has_role('ROLE_USER_TWO') or has_role('ROLE_USER_THREE')")

这样,您实际上是在检查当前用户是否至少拥有这些角色之一,而不是所有角色。