gpt4 book ai didi

symfony - Sonata Admin Bundle 仪表板过滤器实体来自角色和 DDBB 权限

转载 作者:行者123 更新时间:2023-12-04 18:45:09 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

最简单的方法是编辑查询并检查编辑/显示操作中的访问权限。

像这样的东西:

管理类

/**
* {@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;
}

并执行这种 checkin 编辑和显示表单:
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
if (!$this->hasSubjectAccess()) {
throw new AccessDeniedException();
}

// ...
}

另一种方法是实现ACL。您可以在 official documentation 中阅读更多相关信息。

关于symfony - Sonata Admin Bundle 仪表板过滤器实体来自角色和 DDBB 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15900504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com