Sonata User - 安全地自定义管理员查询

Posted

技术标签:

【中文标题】Sonata User - 安全地自定义管理员查询【英文标题】:Sonata User - Customize admin query with security 【发布时间】:2013-07-02 03:16:45 【问题描述】:

我已扩展 SonataUserBundle,我想自定义管理查询以限制列表:

class UserAdmin extends BaseUserAdmin

// ...
    public function createQuery($context = 'list')
    
        $query = parent::createQuery($context);
        $query->andWhere( 
            $query->expr()->eq($query->getRootAlias().'.company', ':comp')
        );
        $query->setParameter('comp', $securityContext->user->getCompany());
        return $query;
    
// ...

在这里,我试图让用户只能看到他公司的用户。 但是$securityContext 没有设置。

有人能告诉我如何将安全上下文注入我的管理类吗?

【问题讨论】:

【参考方案1】:

您必须在 UserAdmin 服务中注入安全上下文服务。

为此,您必须更新捆绑包的 services.yml:

services:
    # ...
    sonata.admin.user:
        class: My\ProjectBundle\Admin\UserAdmin
        tags:
            - name: sonata.admin, manager_type: orm, group: users, label: users
        arguments:
            - null
            - Application\Sonata\UserBundle\Entity\User
            - SonataAdminBundle:CRUD
            - @security.context #forth argument
        calls:
            - [setTranslationDomain, [MyProjectBundle]]
            - [setUserManager, [@fos_user.user_manager]]

在你的 UserAdmin 类中,重写构造函数:

namespace My\ProjectBundle\Admin;

class UserAdmin extends Admin


    private $securityContext = null;

    public function __construct($code, $class, $baseControllerName, $secutiryContext=null)
    
        parent::__construct($code, $class, $baseControllerName);
        $this->securityContext = $securityContext;
    

    public function createQuery($context = 'list')
    
        $query = parent::createQuery($context);
        $query->andWhere( 
            $query->expr()->eq($query->getRootAlias().'.company', ':comp')
        );
        $query->setParameter('comp', $this->securityContext->user->getCompany());
        return $query;
    

我没有测试这段代码,但是我使用这个方法在奏鸣曲管理器中注入 service_container 来使用 Gedmo Uploadable 管理文件上传。

希望这会有所帮助。

【讨论】:

好的,我明白了,但我的包中没有定义任何服务。如果我放一个,它不会被解释。 嗯,这是因为您必须在服务定义中调用 setUserManager 方法。参见 vendor/sonata-project/user-bundle/Sonata/UserBundle/Resurces/config/admin_orm.xml 是的,我删除了我的第二条评论。那么关于我的第一个,你有线索吗? 你必须使用依赖注入来加载你的 config.yml。检查文件 My\ProjectBundle\DependencyInjection\MyProjectExtension symfony.com/doc/current/cookbook/bundles/…【参考方案2】:

我知道这是一个非常古老的问题,但是呢?

$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();

public function createQuery($context = 'list') 的第一件事

然后在setParameter 你可以使用$user->getCompany()

像这样;

public function createQuery($context = 'list')

    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();

    $query = parent::createQuery($context);
    $query->andWhere( 
        $query->expr()->eq($query->getRootAlias().'.company', ':comp')
    );
    $query->setParameter('comp', $user->getCompany());
    return $query;

【讨论】:

以上是关于Sonata User - 安全地自定义管理员查询的主要内容,如果未能解决你的问题,请参考以下文章

Sonata 管理员/用户:“类不存在”(ReflectionException)

Sonata Admin的自定义Flash消息

Sonata-Project 的 Google Authenticator:来自 Application\Sonata\UserBundle\Entity\User 的未定义方法“getTwoStep

Sonata + Fos_user - 如何仅显示与用户相关的实体?

安装 sonata-project/user-bundle symfony 3.3 lts

Sonata User Bundle 自定义批处理操作