Роли для администраторов Sonata

Я использую SonataAdminBundle без SonataUserBundle, но только с FOSUserBundle. Причина в том, что я использую Symfony 3, а SonataUserBundle там не работает.

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

Но значит ли это, что я должен вот так прописать 24 роли администраторов?

ROLE_OPTICKS_ACCESS:
    - ROLE_SONATA_ADMIN_FOO_LIST
    - ROLE_SONATA_ADMIN_FOO_VIEW
    - ROLE_SONATA_ADMIN_FOO_CREATE
    - ROLE_SONATA_ADMIN_FOO_EDIT
    - ROLE_SONATA_ADMIN_FOO_DELETE
    - ROLE_SONATA_ADMIN_FOO_EXPORT

Тогда в моем файле security.yml будет около 144 таких строк. А то я могу убрать две строчки с надписью ROLE_SONATA_ADMIN_USER_CREATE и ROLE_SONATA_ADMIN_USER_EDIT и тогда еще придумать выход сделать так, чтобы можно было редактировать только свой профиль.

Кто-нибудь может помочь? Это лучший способ сделать это? Я делаю это правильно?

Потому что я как раз думал о чем-то подобном;

protected function configureRoutes(RouteCollection $collection)
{
    $securityContext = $this->getConfigurationPool()->getContainer()->get('security.authorization_checker');

    if (!$securityContext->isGranted('ROLE_SUPER_ADMIN')) {
        $collection->remove('create');
        $collection->remove('edit');
    }
}

Но, видимо, я делаю это неправильно, и я также получаю сообщение об ошибке;

Хранилище токенов не содержит токена аутентификации. Одна из возможных причин может заключаться в том, что для этого URL-адреса не настроен брандмауэр.

Пожалуйста, мне очень нужна помощь.


person Mentos93    schedule 27.10.2016    source источник


Ответы (1)


Вы можете реализовать свой собственный обработчик безопасности

sonata_admin:
    security:
        handler: app.security.handler

Это сервис, и вы должны реализовать свой собственный метод isGranded.

public function isGranted(AdminInterface $admin, $attributes, $object = null)
{
    if ($admin instanceof FooAdmin) {
        return $this->securityChecker->isGranted("ROLE_SONATA_ADMIN_FOO");
    }
}

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

person Dmitry Malyshenko    schedule 27.10.2016