SonataAdmin. Symfony. Некорректно работает разграничение ролей

Рейтинг: 0Ответов: 0Опубликовано: 15.01.2023

Symfony 5.4, sonata-project/admin-bundle 4.16, sonata-project/doctrine-orm-admin-bundle 4.4. В чем проблема: в sonata_admin.yaml неправильно работает разграничение ролей и вывод соответствующих кнопок в дашборде. Способов указания списка разделов в дашборде два:

dashboard:
    security:
        handler: sonata.admin.security.handler.role
        role_admin: ROLE_ADMIN
        role_super_admin: ROLE_SUPER_ADMIN
    groups:
        personal_account:
            label: admin.menu.label.personal_account
            items:
                - route: app_logout
                  label: admin.menu.personal_account.label.logout
                - admin.postgres.old.account
        seo:
            icon: '<i class="fa fa-cubes"></i>'
            label: 'SEO'
            items:
                - route: admin_app_seo_sitemap_page
                  label: admin.menu.label.sitemap
                - admin.postgres.old.seotag
            roles: ['ROLE_SEO']

Первый способ через route и label. Второй через название сервиса, который будет указан в service.yaml. Разница в них в том, что при первом способе тебе необходимо создавать контроллер, который должен от наследоваться от CRUDController. Для второго достаточно лишь иметь класс админа, который наследуется от AbstractAdmin.

Если пользователь будет иметь роль 'ROLE_SEO', то ему в дашборде будет доступен лишь раздел, указанный первым способом. Те разделы, указанные вторым способом ему не будут видны и доступны для перехода. Но для роли, указанной в role_super_admin, всегда буду видны разделы, которые указаны что первым, что вторым. Интересно то, что для роли ROLE_SEO, да и в принципе для любой, кроме указанной в role_super_admin, не видны даже те разделы, у которых разграничения ролей не имеется (то есть группа personal_account доступна всем, но пользователь, который имеет роль ROLE_SEO видит лишь раздел, указанный первым способом).

В документации к sonata-admin (https://docs.sonata-project.org/projects/SonataAdminBundle/en/4.x/reference/dashboard/) по дашборду в примерах указаны как первый, так и второй способ для разграничения ролей. Собственно, сам вопрос: почему не работает второй способ указания разделов? Я с сонатой не так плотно работал и лишь предполагаю, что из-за отсутствия контроллеров, реализущих CRUDController, не срабатывает метод, связанный с разграничением по ролям доступов к разделам.

Иерархия ролей в security.yaml следующая:

role_hierarchy:
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_DEVELOPER, ROLE_TESTER, ROLE_TRANSLATOR, ROLE_MARKETER, ROLE_SUPPORT, ROLE_OWNER, ROLE_SEO]
    ROLE_DEVELOPER: ROLE_ADMIN
    ROLE_TESTER: ROLE_ADMIN
    ROLE_TRANSLATOR: ROLE_ADMIN
    ROLE_MARKETER: ROLE_ADMIN
    ROLE_SUPPORT: ROLE_ADMIN
    ROLE_OWNER: ROLE_ADMIN
    ROLE_SEO: ROLE_ADMIN
    ROLE_ADMIN: ROLE_USER

Дополнение. Сейчас узнал, что разграничение по ролям не работает на те роуты, которые для бандла являются дефолтными. Это 'list', 'show', 'edit', 'create', 'delete' и тд. Но если в методе getAccessMapping() указать, к примеру, методу 'list' роль ROLE_SEO, то пользователь с таким ролем на эту страницу перейти сможет, иначе доступ запрещен.

protected function getAccessMapping(): array
{
    return [
        'list' => 'ROLE_SEO',
    ];
}

Ответы

Ответов пока нет.