我正在使用带有FosUserBundle的SonataAdminBundle。我的仪表板中有一些问题。
在我的应用程序中,我有资源,公司和用户。用户属于公司,并且可以创建属于他的公司的资源。所有这些过程都将在仪表板中完成,该仪表板可供所有角色使用。
我要做的是每个人都可以访问仪表板,但当用户选择要在仪表板中列出的实体(资源)时,只会显示其公司的实体。例如,两家公司可以创建一个车辆(资源),但每家公司只会看到自己的车辆(资源)。
总结,我希望仪表板过滤连接的用户公司的实体。 有没有办法在Sonata中创建一个查询,只显示一些实体,具体取决于用户的Company_Id和BBDD中映射的资源的Company_Id?
答案 0 :(得分:4)
最简单的方法是编辑查询并检查编辑/显示操作中的访问权限。
这样的事情:
管理员课程
/**
* {@inheritdoc}
*/
public function createQuery($context = 'list')
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
/** @var \Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery @query */
$query = $this->getModelManager()->createQuery($this->getClass(), 'o');
if (!$this->isGranted('MASTER')) {
$query
->where('entity.user = :user')
->setParameter('user', $user)
;
}
return $query;
}
如果用户不是MASTER,他只能看到自己的实体。
您还可以实现管理类的hasSubjectAccess
方法,如:
/**
* Check whether the user has access to the subject
*
* @return bool
*/
protected function hasSubjectAccess()
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
if (!$this->isGranted('MASTER') && $this->getSubject()->getUser() !== $user) {
return false;
}
return true;
}
并在编辑和显示表单中执行此类检查:
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
if (!$this->hasSubjectAccess()) {
throw new AccessDeniedException();
}
// ...
}
另一种方法是实现ACL。您可以在official documentation
中详细了解相关内容答案 1 :(得分:1)
最后,我这样得到:
public function createQuery($context = 'list')
$query = $this->getModelManager()->createQuery($this->getClass(), 'entity');
if ( ($this->getClass() instanceof \Sademer\CoreBundle\Entity\Resource)
|| ( is_subclass_of($this->getClass(), \Sademer\CoreBundle\Entity\Resource') ) )
{
$query->select ('e');
$query->from($this->getClass(), 'e');
$query->from('CoreBundle\Entity\Resource', 'r');
$query->where('e.id = r.id AND r.company = :company');
$query->setParameter('company', 5);
}
}
答案 2 :(得分:1)
对我来说,createQuery()函数不起作用。可能是由于Sonata Admin的版本。无论如何,对我有用的是configureDatagridFilters()函数。
它与createQuery完成相同的工作,看起来像这样:
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$qb = $datagridMapper
->getDatagrid()
->getQuery()
->getQueryBuilder();
$qb->andWhere(
// Your where clause here
);
$qb->setParameter(); // Set Parameter
}