[英]Symfony - use voter in entityRepository
我的問題是:我有一個/ user頁面,顯示所有用戶的列表。 該頁面僅對已登錄用戶可見,並且根據當前登錄用戶的類型,他只會看到列表的一部分。 我認為選民將是一個很好的解決方案(如果有更好的選民,請告訴我),但是我對supportsClass有問題。 用戶列表是UserRepository中名為getAllUsers的查詢,我嘗試將securityContext傳遞到存儲庫,以便可以查詢當前用戶是否具有訪問權限。 我的動作如下所示:
public function listAction($limit = 50, $offset = 0) {
$manager = $this->getDoctrine()->getManager();
$userRepository = $manager->getRepository('SeamUserBundle:User');
$users = $userRepository->getAllUsers($this->get('security.context'));
return ....
}
在userRepository中,我嘗試了以下操作:
public function getAllUsers($securityContext) {
....
if(!$securityContext->isGranted('USER_LIST_ALL', null)) {
//modify query
}
...
}
但是如果我將null作為第二個參數傳遞給isGranted,則$ class現在是Voter,因此supportsClass返回false。 我做錯了嗎? 如果是這樣-我該怎么做? 如果沒有-缺少什么? 如何將用戶實體傳遞給isGranted?
提前致謝。
角色和選民之間的區別:
投票者可以告訴用戶是否可以對對象執行操作 (user-action-instance_of_object關系)。 選民的邏輯取決於您。 您需要實施它們,而symfony只會找到選民並收集他們的決定。 示例:用戶可以編輯文章的特定實例。
可以通過角色來判斷用戶是否具有全局許可 (關系用戶操作)。 角色背后的邏輯由symfony處理。 您僅向用戶添加角色,並且在$ securityContext上需要角色。 示例:用戶可以撰寫新文章。
列出所有用戶是基於用戶可以執行的操作,因此這是角色的工作。 您需要向允許列出所有用戶的用戶添加角色ROLE_USER_LIST_ALL
。 您可能應該在用戶登錄時在UserProvider中執行此操作。您需要做的只是UserInterface需要實現getRoles。 有關在數據庫中定義角色的一些信息可以在symfony文檔中找到
然后在您的UserRepository
調用中
$securityContext->isGranted('ROLE_USER_LIST_ALL');
注意沒有第二個參數,因為它是與特定對象實例無關的全局權限。
同樣,將安全上下文作為getter的參數傳遞也是不理想的。 相反,最好將存儲庫指定為服務並設置安全上下文。
services:
seam.user.repository:
class: Seam\UserBundle\UserRepository
factory_service: doctrine.orm.entity_manager
factory_method: getRepository
arguments:
- Seam\UserBundle\User
calls:
- [ setSecurityContext, [@security.context] ]
然后您可以使用
$container->get('seam.user.repository);
//in controler use $this instead of $container
(需要在UserRepository
類中實現setSecurityContext
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.