SonataAdminBundle показывает блоки панели управления в зависимости от пользователя

Я использую SonataAdminBundle с Symfony 2.2 и хочу отображать блоки панели инструментов в зависимости от того, какой пользователь вошел в систему.

e.g.

  • Пользователи с суперадминистратором группы увидят блоки «Управление пользователями» и «Сообщения».
  • Пользователи с групповым персоналом будут видеть только заблокированные «Сообщения».

Я прочитал всю документацию, особенно безопасность doc, но не нашел информации о том, как ограничить просмотр панели инструментов. Я уже реализовал фильтр, который не будет отображать записи в представлении списка класса сущностей, если разрешений пользователя недостаточно.

Но было бы лучше вообще не показывать ему блоки.

Есть идеи, как это сделать?


person cb0    schedule 12.06.2013    source источник
comment
у вас уже есть фильтр, блокирующий представление списка, но вы вообще не хотите его показывать? просьба уточнить :)   -  person Nicolai Fröhlich    schedule 12.06.2013
comment
Да. Теперь я вообще не хочу показывать блок в панели управления. На данный момент он отображает блок на панели инструментов, и когда я перехожу к просмотру списка, мой фильтр скрывает записи в списке от определенных пользователей.   -  person cb0    schedule 12.06.2013


Ответы (2)


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

sonata.block.service.foo:
    class: Acme\DemoBundle\Block\FooBlockService
    arguments: [ "sonata.block.service.foo", "@templating", "@doctrine", "@security.context" ]
    tags:
      - { name: sonata.block }

Затем я определил блочную службу __construct() как:

//Acme\DemoBundle\Block\FooBlockService
public function __construct($name, EngineInterface $templating, $doctrine, $securityContext)
{
    parent::__construct($name, $templating);
    $this->doctrine = $doctrine;
    $this->securityContext = $securityContext;
}

Наконец, в функции execute первое, что я сделал, это проверил конкретную роль пользователя следующим образом:

//Acme\DemoBundle\Block\FooBlockService
public function execute(BlockContextInterface $blockContext, Response $response = null)
{

    if( $this->securityContext->isGranted("ROLE_ACME_FOO") === false )
    {
        return new Response();
    }

    //... more code

Это работает, но похоже на взлом. В основном потому, что Блок проходит все свои этапы и только на выходе ничего не возвращает, то есть накладные расходы. Лучшим решением было бы каким-то образом предотвратить загрузку всего блока на основе некоторого пользовательского кода.

В заключение, это не лучший способ, но он сработал для меня!

person Frank van Luijn    schedule 24.02.2014
comment
Большое спасибо за это!! Я определ. попробуйте и примите, если это решит проблему, с которой я все еще борюсь. - person cb0; 25.02.2014
comment
Пожалуйста. Это в конечном итоге решило вашу проблему? Я все еще думаю о других подходах, так как это не самый чистый. - person Frank van Luijn; 10.03.2014
comment
У меня та же проблема, и я решил ее таким же образом, прежде чем читать ваш ответ, но это ужасно. На моей панели продолжает отображаться черное пространство из-за класса столбцов, который я добавил в блок, например { position: top, type: my_block_name_service, class: col-xs-8 }. Это col-xs-8 делает беспорядок. - person Cassiano; 13.10.2016

Вы можете ограничить доступ к блокировке с помощью ролей, например:

sonata_admin:
dashboard:
    blocks:
        - { position: top, type: your_service_block_name, class: 'col-xs-4', roles: [ROLE_SOME_NAME_HERE_, ROLE_SOME_NAME_HERE_2] }

Вы можете проверить под SonataAdminBundle:Core:dashboard.html.twig, как это работает roles:

{% if block.roles|length == 0 or is_granted(block.roles) %}
<div class="{{ block.class }}">
    {{ sonata_block_render({ 'type': block.type, 'settings': block.settings}) }}
</div>{% endif %}
person Cassiano    schedule 13.10.2016