Sonata管理员的角色

时间:2016-10-27 09:28:58

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

我正在使用SonataAdminBundle 而不是 SonataUserBundle,但仅使用FOSUserBundle。原因是因为我使用的是Symfony 3,而SonataUserBundle并没有在那里工作。

现在,我有24个管理服务。我只需要修改一个管理类,这样用户就无法创建新用户,也无法修改其他用户'配置文件。只有超级管理员才能做到这一点。

但这是否意味着我必须写24个管理员'像这样的角色?

ROLE_OPTICKS_ACCESS:
    - ROLE_SONATA_ADMIN_FOO_LIST
    - ROLE_SONATA_ADMIN_FOO_VIEW
    - ROLE_SONATA_ADMIN_FOO_CREATE
    - ROLE_SONATA_ADMIN_FOO_EDIT
    - ROLE_SONATA_ADMIN_FOO_DELETE
    - ROLE_SONATA_ADMIN_FOO_EXPORT

然后我会在security.yml中找到大约144行。然后,我可以移除显示ROLE_SONATA_ADMIN_USER_CREATEROLE_SONATA_ADMIN_USER_EDIT的两行,然后仍然想出办法让它只能编辑自己的个人资料。

任何人都可以提供帮助吗?这是最好的方法吗?我做得对吗?

因为我只想到这样的事情;

protected function configureRoutes(RouteCollection $collection)
{
    $securityContext = $this->getConfigurationPool()->getContainer()->get('security.authorization_checker');

    if (!$securityContext->isGranted('ROLE_SUPER_ADMIN')) {
        $collection->remove('create');
        $collection->remove('edit');
    }
}

但显然我是以错误的方式做到这一点,而且我也说错了;

  

令牌存储不包含身份验证令牌。一种可能   原因可能是没有为此URL配置防火墙

拜托,我需要拼命帮助。

1 个答案:

答案 0 :(得分:0)

您可以实现自己的安全处理程序

sonata_admin:
    security:
        handler: app.security.handler

这是一项服务,您必须实施自己的isGranded方法

public function isGranted(AdminInterface $admin, $attributes, $object = null)
{
    if ($admin instanceof FooAdmin) {
        return $this->securityChecker->isGranted("ROLE_SONATA_ADMIN_FOO");
    }
}

通过这种方式,任何具有ROLE_SONATA_ADMIN_FOO角色的人都可以使用FooAdmin制作任何作品。它只是一个草图,当然,你可以实现更复杂的逻辑。