Задать вопрос
@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, но нужно чтобы он заменялся только в тестовом окружении.
  • Вопрос задан
  • 29 просмотров
Подписаться 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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