Symfony Voters о сборе объектов

Я использую Voters для управления разрешениями в моем приложении, и все работает нормально для отдельных объектов.

То, что я, кажется, не могу сделать, так это применить Voter к коллекции объектов. Например, у меня есть конечная точка / люди, которые вернут полный список людей, но он должен быть отфильтрован в соответствии с правами каждого пользователя (руководитель отдела должен видеть только людей в своем собственном отделе). Есть ли способ сделать это с избирателями?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
2
0
688
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, это можно сделать с помощью средства проверки авторизации:

// your controller

private $authorizationChecker;

public function __construct(AuthorizationCheckerInterface $authorizationChecker)
{
    $this->authorizationChecker = $authorizationChecker;
}

// in your action

return array_filter($userCollection, function (User $user) {
    return $this->authorizationChecker->isGranted('VOTER_NAME', $user);
});

или просто, если вы контроллеры, расширяете класс Symfony Controller:

return array_filter($userCollection, function (User $user) {
    return $this->isGranted('VOTER_NAME', $user);
});

Спасибо за ваш ответ. Я не уверен, что понимаю, как это будет работать. Моя проблема возникает из-за того, что избиратель всегда возвращает истину или ложь. Мне нужно было бы вернуть массив объектов. Не могли бы вы уточнить решение?

Sorix 15.06.2018 13:08

Благодарю вас за ваш ответ, он работает :) Как комментарий, я думаю, что он также работает без необходимости вводить AuthorizationCHeckerInterface, поскольку Symfony, похоже, уже делает это. Итак, для меня вызов $ this-> isGranted ('VOTER_NAME', $ user) отлично работает.

Sorix 15.06.2018 14:13

Да, я написал так, потому что мои контроллеры вызываются по протоколу POPO и не расширяют какой-либо класс. Я предпочитаю вводить все самостоятельно.

emix 15.06.2018 14:21

Другие вопросы по теме