2017-07-19 23 views
1

我在我的Sonata項目中啓用了模擬。授予用戶權限時刪除'模擬'列ROLE_PREVIOUS_ADMIN

當具有角色'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

您發佈的內容看起來正確。可能會仔細檢查它是否與您的實際代碼相符。同時檢查調試工具欄以查看用戶實際擁有的角色。可能是其他東西阻止顯示。 – Cerad

回答

2

你的條件和角色都很好,但是從索納塔adminisGranted()功能檢查索納塔,基於角色的只有(見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服務替代管理員類。例如,將其注入到管理員類後,應該可以工作:

if ($this->authorizationChecker->isGranted('ROLE_ALLOWED_TO_SWITCH') 
    && !$this->authorizationChecker->isGranted('ROLE_PREVIOUS_ADMIN')) 
{