5

我将 SonataAdminBundle 与 FosUserBundle 一起使用。我的仪表板有一些问题。

在我的应用程序中,我有资源、公司和用户。一个用户属于一个公司,并且可以创建也属于他的公司的资源。所有这些过程都将在仪表板中完成,所有角色都可以访问。

我想做的是每个人都可以访问仪表板,但是当用户选择要在仪表板中列出的实体(资源)时,只会显示他公司的实体。例如,两家公司可以创建一个车辆(资源),但每个公司只能看到自己的车辆(资源)。

最后,我希望仪表板过滤连接用户的公司实体。有没有办法在奏鸣曲中创建一个查询,以根据用户的 Company_Id 和 BBDD 中映射的资源的 Company_Id 显示一些实体?

4

3 回答 3

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。您可以在官方文档中阅读更多相关信息

于 2013-04-09T12:55:13.727 回答
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);
    }
}
于 2013-04-11T11:16:29.290 回答
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
}
于 2014-07-16T20:01:26.283 回答