2015-05-10 52 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的相应服务以仅返回角色的层次结构。