2

В моем проекте Symfony2 мне удалось настроить FOSUserBundle + SonataUserBundle + SonataAdminBundle после официальных документов. Настало время настроить ACL (список управления доступом).ACL + SonataAdminBundle + SonataUserBundle

Что я сделал:

  • Создал AdminClass под названием AdminReport

  • приложение/консоль соната: админ: установка-ACL

    install ACL for sonata.admin.report 
    update role: ROLE_SONATA_ADMIN_REPORT_GUEST, permissions: ["LIST"] 
    update role: ROLE_SONATA_ADMIN_REPORT_STAFF, permissions: ["LIST","CREATE"] 
    update role: ROLE_SONATA_ADMIN_REPORT_EDITOR, permissions: ["OPERATOR","EXPORT"]
    • создал новый пользователь, предоставивший его с ROLE_SONATA_ADMIN_REPORT_STAFF
    • ap р/консоли соната: админ: генерировать-объект-Acl
    • Помнить с этим пользователем, и доступ к ним по умолчанию/администратор/панель

    блок, содержащий AdminReport должен появиться, но это не ... я пропускаю что нибудь ?

Вот мой config.yml

sonata_admin: 
    security: 
     handler: sonata.admin.security.handler.acl 
      information: 
       GUEST: [VIEW, LIST] 
       STAFF: [EDIT, LIST, CREATE] 
       EDITOR: [OPERATOR, EXPORT] 
       ADMIN: [MASTER] 
      admin_permissions: [CREATE, LIST, DELETE, UNDELETE, EXPORT, OPERATOR, MASTER] 
      object_permissions: [VIEW, EDIT, DELETE, UNDELETE, OPERATOR, MASTER, OWNER]

EDIT я попытался получить доступ непосредственно app_dev.php/администратора/приложение/отчет/список с этим пользователем, и Symfony выдает ошибку Access Denied , Журнал говорит

DEBUG - Доступ запрещен, пользователь не является ни анонимным, ни запоминающимся. И если я получаю доступ к app_dev.php/admin/app/report/list, он работает!

Так что я попытался изменить обработчик из

sonata.admin.security.handler.acl
в
sonata.admin.security.handler.roles

Это работает, потому что я могу видеть блок в админ панели. Я также попытался изменить

access_decision_manager: 
     strategy: unanimous 
на
affirmative
, но это не сработало ...

Я определенно отсутствует что-то, но где?

+0

Да та же проблема здесь, я работаю над ним на самом деле. Когда я его решила, я дам вам решение :) –

+0

Получили ли вы информацию из своего исследования? Я полностью застрял в этом ... –

+0

Я немного поработал над этим и получил что-то функциональное, я напишу ответ, когда у меня осталось несколько минут :) –

ответ

0

Ну, после некоторой настройки я добился ее работы.

Во-первых, в моем 'sonata.yml' в приложение/Config/ Я изменил завивка вроде следующего:

приложение/Config/sonata.yml:

sonata_admin: 
    security: 
     handler: sonata.admin.security.handler.acl 

     # acl security information 
     information: 
      # GUEST: [VIEW, LIST] 
      # STAFF: [EDIT, LIST, CREATE] 
      # EDITOR: [OPERATOR, EXPORT] 
      # ADMIN: [MASTER] 
      EDIT: EDIT 
      LIST: LIST 
      CREATE: CREATE 
      VIEW: VIEW 
      DELETE: DELETE 
      EXPORT: EXPORT 
      MASTER: MASTER 

Чтобы избежать этого ...

DEBUG - Доступ запрещен, пользователь не является ни анонимным, ни помните-мне

...Я прокомментировал следующее, потому что я думаю, что брандмауэр заблокировал доступ к моему пользователю. Может быть, не мудрее решение, но работает хорошо сейчас :)

приложение/Config/security.yml:

# set access_strategy to unanimous, else you may have unexpected behaviors 
# access_decision_manager: 
#  strategy: unanimous 

Обратите внимание, что мое приложение построено только вокруг администратора dahboard, поэтому каждый пользователь должен иметь доступ к панели управления, когда они созданы. Таким образом, я изменил мой Пользователь конструктор так:

SRC/Application/Sonata/UserBundle/Entity/User.php:

class User extends BaseUser 
{ 
    /** 
    * @var integer $id 
    */ 
    protected $id; 

    public function __construct() { 
     parent::__construct(); 
     // your own logic 
     $this->roles = array('ROLE_USER', 'ROLE_SONATA_ADMIN', 'ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT'); 
    } 

    /** 
    * Get id 
    * 
    * @return integer $id 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

EDIT: Кажется, что, не зная об этом, я ответил на другой ваш вопрос ^^ " (How can I assign default role to user in Symfony2)

Теперь каждый пользователь может получить доступ к панели мониторинга, но, как и ваша проблема, они ничего не видят.

Мне нужно было использовать ACL, но как роли, которые мои пользователи принадлежат к группам, у которых есть свой ACL.

Как только мой пользователь принадлежит к одной или нескольким группам, он получил разрешения групп в дополнение к своим собственным разрешениям.

Управляя разрешениями одной группы, каждый пользователь, принадлежащий к этой группе, имеет свои разрешения. И, редактируя разрешения пользователя, я могу сделать доступ к некоторым страницам, которые группа не разрешит.

Например:

     ┌─────────────┐ 
         │ GROUP_1 │     ┌───────────────┐ 
         ├─────────────┤     │  USER_1 │ 
         │ CAT2_VIEW │     │ applied perms │ 
         │ CAT2_LIST │     ├───────────────┤ 
         │ CAT2_EDIT │     │ CAT1_VIEW  │ 
         │ CAT2_DELETE │     │ CAT1_LIST  │ 
         ├─────────────┤     ├───────────────┤ 
         │ CAT3_VIEW │ ├────┐   │ CAT2_VIEW  │ 
┌─────────────┐   │ CAT3_LIST │  │   │ CAT2_LIST  │ 
│ USER_A │   │ CAT3_EDIT │  │   │ CAT2_EDIT  │ 
├─────────────┤<────────┤ CAT3_DELETE │  │   │ CAT2_DELETE │ 
│ CAT1_VIEW │   └─────────────┘  │   ├───────────────┤ 
│ CAT1_LIST │        ├────> │ CAT3_VIEW  │ 
│    │   ┌─────────────┐  │   │ CAT3_LIST  │ 
│    │<────────┤ GROUP_2 │  │   │ CAT3_EDIT  │ 
└─────────────┘   ├─────────────┤  │   │ CAT3_DELETE │ 
         │ CAT4_VIEW │  │   ├───────────────┤ 
         │ CAT4_LIST │  │   │ CAT4_VIEW  │ 
         │ CAT4_EDIT │ ├────┘   │ CAT4_LIST  │ 
         │ CAT4_DELETE │     │ CAT4_EDIT  │ 
         │ CAT4_EXPORT │     │ CAT4_DELETE │ 
         └─────────────┘     │ CAT4_EXPORT │ 
                 └───────────────┘ 

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

PS: Если кто-нибудь увидит какую-либо ошибку или какую-то нелогичную вещь, не стесняйтесь сказать мне в комментарии, я все еще участвую в использовании, и это будет полезно :)

0

Карта разрешения SonataAdminBundle расширяет BasicPermissionMap Symfony. Только если вы измените эту конфигурацию по умолчанию, AclVoter поддерживает атрибуты «LIST» и «EXPORT» и может голосовать за предоставление разрешенных прав.

parameters: 
    security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap 

Смотрите мой ответ на AclVoter denies access to 'LIST'