Я пытаюсь изменить стратегию принятия решения об управлении доступом в Symfony проекте, но, похоже, он не работает.
В моем security.yaml
есть следующее:
security:
access_decision_manager:
strategy: unanimous
allow_if_all_abstain: false
access_control:
- { path: ^/dev/test, roles: [COMPLEX_TEST, ROLE_OTHER] }
Мне нужно, чтобы и COMPLEX_TEST
, и ROLE_OTHER
были предоставлены для того, чтобы маршрут был доступен (COMPLEX_TEST
проверяется избирателем с пользовательской ролью).
Но когда я пытаюсь получить доступ к маршруту, только вызывается голосующий COMPLEXT_TEST
, и это потому, что он разрешает доступ, а стратегия все еще affirmative
.
Я могу сказать это, потому что при отладке кода я вижу, что значение в Symfony\Component\Security\Core\Authorization\AccessDecisionManager
равно всегда affirmative
, независимо от того, что я установил в security.yaml
.
На данный момент я создал проход компилятора, который вынуждает стратегию unanimous
, но это взлома:
class FixAccessDecisionManagerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
if ($container->hasDefinition('security.access.decision_manager')) {
$definition = $container->getDefinition('security.access.decision_manager');
$definition->setArgument('$strategy', AccessDecisionManager::STRATEGY_UNANIMOUS);
}
}
}
С проходом компилятора я вижу, что значение в Symfony\Component\Security\Core\Authorization\AccessDecisionManager
правильно установлено на unanimous
и контроль доступа работает как положено.
видите, чего мне не хватает? Или это ошибка в Symfony? Моя Symfony версия 4.4.7
.
Спасибо за ваше время.