Symfony2 Sonata Admin捆绑为'前端'

时间:2013-12-17 10:45:15

标签: symfony sonata-admin sonata-user-bundle

我们正在一个看起来像这样的项目中运行:

客户可以登录到可以编辑信息的控制面板。 他们编辑的信息将由其他软件通过REST API提取(这已经在以前的版本中运行)。

实际上,我们的应用程序的基础实际上与SonataAdminBundle相同。但据我所知,我无法过滤用户登录的SonataAdminBundle中查看的数据。

例如:

  • User1 User2 User3 是来自 Customer1 的员工。他们只需要查看他们从 Customer1
  • 添加的数据
  • 当新客户 Customer2 添加到系统时,某些用户也会创建 User10 User11 。他们只需要查看有关 Customer2 的信息,而不是 Customer1 添加的信息(反之亦然)

仅使用SonataAdminBundle可以实现吗?或者我们是否必须创建自己的软件才能实现这一目标?

我知道我们必须创造所有不同的多种或多种关系,但这不是问题。主要问题是,我可以通过当前登录的用户过滤数据吗?当以管理员或超级管理员身份登录时,不得应用数据过滤器。

提前致谢!

1 个答案:

答案 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);
}

也许有更好的方法..