【问题标题】:Sonata User - Customize admin query with securitySonata User - 安全地自定义管理员查询
【发布时间】: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 没有设置。

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

【问题讨论】:

    标签: security symfony sonata-admin sonata-user-bundle


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2017-05-17
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2016-06-30
      相关资源
      最近更新 更多