【问题标题】:Roles for Sonata AdminsSonata 管理员的角色
【发布时间】:2016-10-27 09:28:58
【问题描述】:

我正在使用 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');
    }
}

但显然我做错了,我也得到了一个错误说;

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

拜托,我非常需要帮助。

【问题讨论】:

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


    【解决方案1】:

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

    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 进行任何操作。这只是一个草图,当然你可以实现更复杂的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-16
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 2016-06-30
      • 2011-09-26
      相关资源
      最近更新 更多