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-Project 的 Google Authenticator:来自 Application\Sonata\UserBundle\Entity\User 的未定义方法“getTwoStep
Sonata + Fos_user - 如何仅显示与用户相关的实体?