2015-05-10 162 views
3

我想在我的索納塔管理儀表板上使用角色處理器安全。我使用Symfony 2.3。索納塔管理員一般角色

在醫生,我有:

每個權限相對於管理員:如果您嘗試在 FooAdmin(聲明爲sonata.admin.demo.foo服務),以獲得一個列表,將索納塔 檢查用戶是否具有ROLE_SONATA_ADMIN_DEMO_FOO_EDIT角色。

按我的理解,如果我有服務,如:

  • sonata.admin.article
  • sonata.admin.user
  • sonata.admin.tag

然後我需要創建一個編輯的角色,作爲一個列表這3個元素:

ROLE_SONATA_ADMIN_ARTICLE_EDITROLE_SONATA_ADMIN_USER_EDITROLE_SONATA_ADMIN_TAG_EDIT

但我寧願希望創建訪問更多的武將,例如,在我的情況下,簡單地做:ROLE_SONATA_ADMIN_EDIT而不是三的名單。

有沒有一個簡單的方法來做到這一點與此捆綁?

# AppBundle/Security/Handler/MyRoleSecurityHandler.php 

namespace AppBundle\Security\Handler; 

use Sonata\AdminBundle\Admin\AdminInterface; 
use Sonata\AdminBundle\Security\Handler\RoleSecurityHandler; 

class MyRoleSecurityHandler extends RoleSecurityHandler 
{ 

    /** 
    * {@inheritDoc} 
    */ 
    public function getBaseRole(AdminInterface $admin) 
    { 
     return 'ROLE_SONATA_ADMIN_%s'; 
    } 
} 

覆蓋與此相關的類索納塔服務:

# AppBundle/Resources/config/services.yml 
services: 
    #... 

    sonata.admin.security.handler.role: 
     class: AppBundle\Security\Handler\MyRoleSecurityHandler 
     public: false 
     arguments: [@security.context, [ROLE_SUPER_ADMIN]] 

記得在您的層次結構聲明這些角色:

回答

2

您可以輕鬆地通過重寫Sonata\AdminBundle\Security\Handler\RoleSecurityHandler類和getBaseRole方法做到這一點

# app/config/security.yml 

security: 
    role_hierarchy: 
     # ... 
     ROLE_SONATA_ADMIN_LIST: ~ 
     ROLE_SONATA_ADMIN_SHOW: ~ 
     ROLE_SONATA_ADMIN_EDIT: ~ 
     ROLE_SONATA_ADMIN_DELETE: ~ 
     # etc. 

曾經喲ü這些角色分配給用戶,終於可以檢查:

# inside of any admin class 

protected function configureListFields(ListMapper $listMapper) 
{ 
    if ($this->isGranted('EDIT')) { 
     # ... 
    } 
} 

警告!以前的奏鳴曲角色(ROLE_SONATA_ADMIN_ARTICLE_EDIT,ROLE_SONATA_ADMIN_USER_EDIT等)將無法工作。因此,您也可以覆蓋該類和sonata-project/user-bundle/Security/EditableRolesBuilder.php的相應服務以僅返回角色的層次結構。