2015-05-10 2 views
3

Я хочу использовать защиту обработчика ролей на панели инструментов администратора Sonata. Я работаю с Symfony 2.3.Общие роли генерального директора Sonata

В док, у меня есть:

Каждое разрешение является относительно админа: если вы пытаетесь получить список в FooAdmin (объявленный как sonata.admin.demo.foo службы), Sonata будет проверьте, имеет ли пользователь роль ROLE_SONATA_ADMIN_DEMO_FOO_EDIT.

Как я понимаю, если у меня есть такие услуги, как:

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

Затем нужно создать редактируемый роль, будучи список из этих 3 элементов:

ROLE_SONATA_ADMIN_ARTICLE_EDIT и ROLE_SONATA_ADMIN_USER_EDIT и ROLE_SONATA_ADMIN_TAG_EDIT

Но я бы предпочел бы создать доступ к большему числу генералов, например, в моем случае, просто сделать: ROLE_SONATA_ADMIN_EDIT вместо этого и из списка трех.

Есть ли простой способ сделать это с помощью этого комплекта?

ответ

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. 

раз yo U назначить эти роли пользователя, в конце концов вы можете проверить:

# 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, чтобы вернуть только иерархию ролей.