[英]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 的用戶。 當我渲染視圖時,出現此錯誤:
表達式“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.