簡體   English   中英

Symfony-在EntityRepository中使用投票器

[英]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.

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