Как получить полную иерархию ролей в Symfony - PullRequest
16 голосов
/ 19 января 2012

Я использую ролевую иерархию symfony2, она работает хорошо, но для внесения некоторых изменений мне нужно получить role_hierarchy, установленный в моем security.yml.

role_hierarchy:
ROLE_USER: [ROLE_ACCESS_USER, ROLE_ACCESS_DATA, ROLE_ACCESS_PRODUCT]

Используя getRoles() просто верните ROLE_USER, как я могу узнать в моем коде, что ROLE_USER сделан с ROLE_ACCESS_USER, ROLE_ACCESS_DATA, ROLE_ACCESS_PRODUCT?

спасибо за помощь.

Ответы [ 4 ]

38 голосов
/ 19 января 2012

Вы можете получить иерархию из контейнера:

$container->getParameter('security.role_hierarchy.roles')
10 голосов
/ 09 марта 2018

При включенном автоматическом подключении вы также можете напрямую внедрить объект RoleHierarchy, заполненный глобальной иерархией ролей. Просто введите RoleHierarchyInterface в свой контроллер или службу, используя внедрение зависимостей :

use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;

public function __construct(RoleHierarchyInterface $roleHierarchy)
{
    $this->roleHierarchy = $roleHierarchy;
}

Примечание: Это также позволяет вам вызывать getReachableRoles() для объекта RoleHierarchy, что может быть полезно в вашем случае:

use Symfony\Component\Security\Core\Role\Role;

$this->roleHierarchy->getReachableRoles([new Role('ROLE_USER')])

Начиная с Symfony4, вы должны добавить псевдоним для security.role_hierarchy в вашем config/services.yml, добавив следующую строку:

services:
    # creating alias for RoleHierarchyInterface
    Symfony\Component\Security\Core\Role\RoleHierarchyInterface: '@security.role_hierarchy'
0 голосов
/ 04 апреля 2018

security.role_hierarchy.roles - это все роли безопасности, определенные в security.yml

Если вы хотите включить роли администратора Sonata, вы можете проверить код в SonataUserBundle \ Form \ Type \ SecurityRolesType

foreach ($this->pool->getAdminServiceIds() as $id) {
            try {
                $admin = $this->pool->getInstance($id);
            } catch (\Exception $e) {
                continue;
            }

            $securityHandler = $admin->getSecurityHandler();

            foreach ($securityHandler->buildSecurityInformation($admin) as $role => $acls) {
                $roles[$role] = $role;
            }
        }
0 голосов
/ 28 апреля 2016

Для правильного представления ваших ролей вам нужна рекурсия. Роли могут расширять другие роли.

Вот пример: https://stackoverflow.com/a/36900807/3635680

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...