我们正在一个看起来像这样的项目中运行:
客户可以登录到可以编辑信息的控制面板。 他们编辑的信息将由其他软件通过REST API提取(这已经在以前的版本中运行)。
实际上,我们的应用程序的基础实际上与SonataAdminBundle相同。但据我所知,我无法过滤用户登录的SonataAdminBundle中查看的数据。
例如:
仅使用SonataAdminBundle可以实现吗?或者我们是否必须创建自己的软件才能实现这一目标?
我知道我们必须创造所有不同的多种或多种关系,但这不是问题。主要问题是,我可以通过当前登录的用户过滤数据吗?当以管理员或超级管理员身份登录时,不得应用数据过滤器。
提前致谢!
答案 0 :(得分:0)
是的,可以只使用SonataAdminBundle。
首先,用户通过不同的列表视图访问数据,因此您需要覆盖Admin类的createQuery方法以显示正确的Customer。
(不要忘记注入@ security.context服务)
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
if (!$this->isGranted('ROLE_SUPER_ADMIN') || !$this->isGranted('ROLE_ADMIN'))
{
$user = $this->securityContext->getToken()->getUser();
$query->
// your custom query.
;
}
return $query;
}
然后,您需要隐藏所有其他操作(显示,编辑和删除),以防止用户访问其他客户。
要做到这一点,我覆盖我的Controller的动作,并在调用父方法之前添加我自己的逻辑。
public function editAction($id = null)
{
// check if the user can access to the current customer
// if not throw new AccessDeniedException();
return parent::editAction($id);
}
也许有更好的方法..