Sonata Admin一般角色

时间:2015-05-10 17:12:29

标签: symfony roles sonata-admin

我想在我的Sonata管理信息中心使用角色处理程序安全性。我使用Symfony 2.3。

在文档中,我有:

  

每个权限都与管理员相关:如果您尝试获取列表   FooAdmin(声明为sonata.admin.demo.foo服务),Sonata将   检查用户是否具有ROLE_SONATA_ADMIN_DEMO_FOO_EDIT角色。

据我了解,如果我有以下服务:

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

然后我需要创建一个编辑角色,作为这三个元素的列表:

ROLE_SONATA_ADMIN_ARTICLE_EDIT以及ROLE_SONATA_ADMIN_USER_EDITROLE_SONATA_ADMIN_TAG_EDIT

但我更愿意创建访问更多将军,例如,在我的情况下,只需执行:ROLE_SONATA_ADMIN_EDIT而不是三个列表。

使用此捆绑包有没有一种简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以通过覆盖Sonata\AdminBundle\Security\Handler\RoleSecurityHandler类和getBaseRole方法轻松完成此操作:

# 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]]

请记住在层次结构中声明这些角色:

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