Ограничьте доступ к маршруту / методу Symfony 3.4 одной конкретной ролью, используя аннотации - PullRequest
0 голосов
/ 10 октября 2019

У меня есть иерархия ролей в security.yml, которая выглядит следующим образом:

role_hierarchy:
    ROLE_SUPERVISOR:   ROLE_USER
    ROLE_MANAGER:      ROLE_SUPERVISOR
    ROLE_SUPPORT:      ROLE_MANAGER
    ROLE_ADMIN:        ROLE_SUPPORT

В моем контроллере у меня есть следующие определения:

/**
 * Collect user details.
 *
 * @Route(
 *      "/course/site/new/customerdetails",
 *      name = "course_site_new_customerdetails"
 * )
 * @IsGranted("IS_AUTHENTICATED_FULLY")
 * @param Request $request
 * @return Response
 */
public function customerDetailsAction(Request $request): Response
{
    // prevent a manager from entering
    if ($this->getUser()->hasRole('ROLE_MANAGER')) {
        return $this->redirectToRoute('supervisor_index');
    }

Использование аннотаций , есть ли способ, которым я могу запретить доступ к этому методу / маршруту для Менеджеров, но впустить Супервизоров?

Я знаю, что очевидным изменением будет переопределение иерархии, однако Супервизоры "ниже" Менеджеровв цепочке.

1 Ответ

1 голос
/ 10 октября 2019

@IsGranted ограничен РОЛЬМИ и привилегиями, за которые проголосовали охранники (за роли голосует конкретный избиратель), поскольку ваша роль менеджера, очевидно, включает роль руководителя (по любой причине). Иерархии в смысле ролей работают так, что это по существу дерево, в котором роль пользователя находится в корне, и она ответвляется от этой. Правила для ваших ролей должны быть:

ROLE_MANAGER: ROLE_USER
ROLE_SUPERVISOR: ROLE_MANAGER

, которые должны читаться как «каждый менеджер - пользователь» и «каждый руководитель - менеджер». Для этого достаточно @IsGranted('ROLE_SUPERVISOR').

Однако вы можете быть более явным, используя синтаксис @Security и требуя, чтобы пользователь возвращал определенную роль для User::getRoles():

@Security("'ROLE_SUPERVISOR' in user.getRoles()")

(может быть, user.roles достаточно ... но я не совсем уверен).

не забывайте предложение use:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

Также обратите внимание,эти роли кэшируются до выхода из системы.

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