我已经在我的Sonata项目中启用了模仿。
当具有角色“ROLE_ALLOWED_TO_SWITCH”的用户模拟用户时,我希望在模仿时进入用户列表时隐藏列模拟。用户在模仿时无法模仿,将抛出异常。但我不想要这个例外,我想要一条好消息来显示它是不可能的,而是完全隐藏列,以便链接甚至不可用。
if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) {
$listMapper
->add('impersonating', 'string',
['template' => 'SonataUserBundle:Admin:Field/impersonating.html.twig'])
;
}
当用户有角色'ROLE_PREVIOUS_ADMIN'时,如何阻止显示此列?因为这不想工作:
if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH') && !$this->isGranted('ROLE_PREVIOUS_ADMIN')) {
这确实会删除模拟用户的列,但对于具有“ROLE_ALLOWED_TO_SWITCH”角色但没有忙于模拟的用户,它也会被删除。
答案 0 :(得分:1)
您的条件和角色都很好,但Sonata isGranted()
类的admin
函数仅检查Sonata-Role-Based(参见RoleSecurityHandler::isGranted()
):
public function isGranted(AdminInterface $admin, $attributes, $object = null)
{
// ...
foreach ($attributes as $pos => $attribute) {
$attributes[$pos] = sprintf($this->getBaseRole($admin), $attribute);
}
// ...
}
public function getBaseRole(AdminInterface $admin)
{
return 'ROLE_'.str_replace('.', '_', strtoupper($admin->getCode())).'_%s';
}
因此,您应该使用@security.authorization_checker
Symfony服务将系统角色签出到Sonata管理类中。例如,在将它注入admin类之后,这应该可以工作:
if ($this->authorizationChecker->isGranted('ROLE_ALLOWED_TO_SWITCH')
&& !$this->authorizationChecker->isGranted('ROLE_PREVIOUS_ADMIN'))
{