我正在使用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_CREATE
和ROLE_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配置防火墙
拜托,我需要拼命帮助。
答案 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
制作任何作品。它只是一个草图,当然,你可以实现更复杂的逻辑。