簡體   English   中英

fos 用戶:即使用戶只有一個角色,也允許路由到多個角色

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

在我的 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 的用戶。 當我渲染視圖時,出現此錯誤:

表達式“has_role('ROLE_USER_ONE', 'ROLE_USER_TWO', 'ROLE_USER_THREE')”拒絕訪問。

據我了解,Symfony 期望用戶擁有所有角色,我怎樣才能允許對用戶的查看訪問權限,而我的控制器注釋和控制器代碼中至少有這些角色之一?

您不必嘗試將每個角色放入同一個has_role()語句中,而是必須將它們與or像這樣連接:

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

這樣,您實際上是在檢查當前用戶是否至少擁有這些角色中的一個,而不是所有角色。

我想您正在尋找角色層次結構 您的配置將類似於:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM