Задать вопрос
@HellWalk

Почему не работает when@test в security.yaml?

Необходимо подменить базовый аунтификатор в симфони UserAuthenticator:

secured_area:
            pattern: ^/(api|auth)
            stateless: true
            provider: custom_keycloak_user_provider
            entry_point: IDCI\Bundle\KeycloakSecurityBundle\Security\EntryPoint\BearerAuthenticationEntryPoint
            custom_authenticators:
                - App\Security\UserAuthenticator
            logout:
                path: idci_keycloak_security_auth_logout


На мок для тестов App\Security\TestUserAuthenticator. В документации предлагается использовать для этого синтаксис when@test, прописываю в конце config/packages/security.yaml:

when@test:
    security:
        firewalls:
            secured_area:
                custom_authenticators:
                    - App\Security\TestUserAuthenticator


Запускаю тесты:

php vendor/bin/codecept run Api --env=test

Но авторизация все равно проходит через UserAuthenticator. Если по харду заменить аунтификатор:

secured_area:
            pattern: ^/(api|auth)
            stateless: true
            provider: custom_keycloak_user_provider
            entry_point: IDCI\Bundle\KeycloakSecurityBundle\Security\EntryPoint\BearerAuthenticationEntryPoint
            custom_authenticators:
                - App\Security\TestUserAuthenticator
            logout:
                path: idci_keycloak_security_auth_logout


То все работает как надо - аунтификация проходит через TestUserAuthenticator, но нужно чтобы он заменялся только в тестовом окружении.
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Onskills
    PHP: базовый курс
    1 месяц
    Далее
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Т.к. custom_authenticators - массив, то значение не перезаписывается, а мерджится. Попробуйте явно указывать это значение для prod и test окружений, а не перезаписывать его.

security:
    firewalls:
        secured_area:
            pattern: ^/(api|auth)
            stateless: true
            provider: custom_keycloak_user_provider
            entry_point: IDCI\Bundle\KeycloakSecurityBundle\Security\EntryPoint\BearerAuthenticationEntryPoint
            logout:
                path: idci_keycloak_security_auth_logout

when@prod: &prod
    security:
        firewalls:
            secured_area:
                custom_authenticators:
                    - App\Security\UserAuthenticator

when@dev: *prod

when@test:
    security:
        firewalls:
            secured_area:
                custom_authenticators:
                    - App\Security\TestUserAuthenticator


Проще будет завязываться на интерфейс App\Security\UserAuthenticatorInterface и подменять его при запуске тестов в services_test.yaml
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
abdulwasay
@abdulwasay
Cybersecurity | Penetration Testing | SOC 2
Причина, по которой "when@test" не работает внутри security.yaml (Symfony), связана с тем, как контейнер внедрения зависимостей (DI) компилирует конфигурационные файлы.

Синтаксис "when@" — это функция оптимизации для конкретной среды. Она отлично работает в стандартных файлах, таких как framework.yaml или services.yaml, но security.yaml имеет выделенный загрузчик конфигурации, который обрабатывает цепочку файрволов безопасности до того, как блоки маршрутизации среды будут полностью оценены.

Правильный способ сделать это:

Вместо вложения тегов среды внутри одного файла, вам следует изолировать настройки безопасности для конкретной среды в отдельные файлы.

Храните стандартные правила безопасности в: config/packages/security.yaml

Создайте специфическое переопределение для тестовой среды в: config/packages/test/security.yaml

Symfony автоматически объединяет конфигурации внутри каталога /test/ только тогда, когда приложение работает в среде test.

Пример для тестовой среды (config/packages/test/security.yaml):

security:
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
algorithm: auto
cost: 4
time_cost: 3
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы