繁体   English   中英

Symfony2 Sonata Admin Bundle作为“前端”

[英]Symfony2 Sonata Admin Bundle as 'frontend'

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

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

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

例如:

  • User1User2User3Customer1的雇员。 他们只需要查看所有他们从Customer1添加的数据
  • 将新客户Customer2添加到系统后,还将创建一些用户User10User11 他们只需要看到顾客2customer1表 (或相反)添加信息,而不是信息

仅使用SonataAdminBundle是否可能? 还是我们必须创建自己的软件才能做到这一点?

我知道我们必须创建所有不同的多通或单通关系,但这不是问题。 主要问题是,我可以按当前登录的用户筛选数据吗? 并且以管理员或超级管理员身份登录时,无需应用任何数据过滤器。

提前致谢!

是的,只能使用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;
}

然后,您需要对所有其他操作(显示,编辑和删除)进行证券化,以防止用户访问其他客户。

为此,我将覆盖控制器的操作,并在调用父方法之前添加自己的逻辑。

public function editAction($id = null)
{
    // check if the user can access to the current customer
    // if not throw new AccessDeniedException();

    return parent::editAction($id);
}

也许有更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM