繁体   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