Sonata Admin Bundle仪表板从角色和DDBB权限过滤实体

Ang*_*gel 5 dashboard filter symfony fosuserbundle sonata-admin

我正在使用带有FosUserBundle的SonataAdminBundle.我的仪表板中有一些问题.

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

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

总而言之,我希望仪表板过滤连接的用户公司的实体.有没有办法在Sonata中创建一个查询,只显示一些实体,具体取决于用户的Company_Id和BBDD中映射的资源的Company_Id?

Vad*_*man 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;
}
Run Code Online (Sandbox Code Playgroud)

如果用户不是 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;
}
Run Code Online (Sandbox Code Playgroud)

并在编辑和显示表单中执行这种检查:

/**
 * {@inheritdoc}
 */
protected function configureFormFields(FormMapper $formMapper)
{
    if (!$this->hasSubjectAccess()) {
        throw new AccessDeniedException();
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是实施ACL。您可以在官方文档中阅读更多相关信息