授予用户ROLE_PREVIOUS_ADMIN

时间:2017-07-19 13:04:26

标签: php symfony sonata-admin

我已经在我的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”角色但没有忙于模拟的用户,它也会被删除。

1 个答案:

答案 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')) 
{