Как протестировать систему контроля доступа в Symfony 5?

#phpunit #authorization #access-control #symfony5

Вопрос:

Я использую новую систему авторизации Symfony.

В файле security.yaml я установил следующие ограничения доступа.

 security:
    enable_authenticator_manager: true

    //....

    role_hierarchy:
        ROLE_ADMIN: [ROLE_USER]

    access_control:
        - { path: ^/login, roles: PUBLIC_ACCESS }
        - { path: ^/signup, roles: PUBLIC_ACCESS }
        - { path: ^/reset, roles: PUBLIC_ACCESS }
        - { path: ^/, roles: ROLE_USER }
 

В моем тесте я пытаюсь поймать перенаправление 302.

 $client = static::createClient();
$client->request('GET', '/');
$this->assertSame(302, $client->getResponse()->getStatusCode());
 

Но я получаю следующее сообщение об ошибке.

Не удалось подтвердить, что 500 идентичен 302.

Пожалуйста, обратите внимание, что я получаю ошибку 500 вместо кода перенаправления 403.

Затем я пытаюсь отследить запрос с помощью.

 $client->catchExceptions(false);
 

И я вижу следующий стек запросов.

Произошла 1 ошибка:

  1. ПриложениеТестыФункционалДомашний сайт::testGuest SymfonyКомпонентБезопасностьЯдроИсключениеИсключение доступа: Доступ запрещен.

C:Userswebgrprojectsproject-managermanagervendorsymfonysecurity-httpFirewallAccessListener.php:112 C:Userswebgrprojectsproject-managermanagervendorsymfonysecurity-httpFirewallAccessListener.php:106 C:Userswebgrprojectsproject-managermanagervendorsymfonysecurity-bundleDebugWrappedLazyListener.php:49 C:Userswebgrprojectsproject-managermanagervendorsymfonysecurity-bundleSecurityLazyFirewallContext.php:60 C:Userswebgrprojectsproject-managermanagervendorsymfonysecurity-bundleDebugTraceableFirewallListener.php:59 C:Userswebgrprojectsproject-managermanagervendorsymfonysecurity-httpFirewall.php:86 C:Userswebgrprojectsproject-managermanagervendorsymfonyevent-dispatcherDebugWrappedListener.php:117 C:Userswebgrprojectsproject-managermanagervendorsymfonyevent-dispatcherEventDispatcher.php:230 C:Userswebgrprojectsproject-managermanagervendorsymfonyevent-dispatcherEventDispatcher.php:59 C:Userswebgrprojectsproject-managermanagervendorsymfonyevent-dispatcherDebugTraceableEventDispatcher.php:151 C:Userswebgrprojectsproject-managermanagervendorsymfonyhttp-kernelHttpKernel.php:132 C:Userswebgrprojectsproject-managermanagervendorsymfonyhttp-kernelHttpKernel.php:78 C:Userswebgrprojectsproject-managermanagervendorsymfonyhttp-kernelKernel.php:199 C:Userswebgrprojectsproject-managermanagervendorsymfonyhttp-kernelHttpKernelBrowser.php:65 C:Userswebgrprojectsproject-managermanagervendorsymfonyframework-bundleKernelBrowser.php:169 C:Userswebgrprojectsproject-managermanagervendorsymfonybrowser-kitAbstractBrowser.php:402 C:Userswebgrprojectsproject-managermanagertestsFunctionalHomeTest.php:15

Почему я не могу выполнить тест «контроль доступа»?

Почему во время тестирования я получаю ошибку сервера 500 вместо простого перенаправления 302?

Я был бы рад любому предложению.

Заранее спасибо.

Вот еще что я хотел бы добавить, вполне возможно, что эта информация может оказаться решающей. Мой сайт работает по протоколу https.

Ответ №1:

Наконец, я понял, в чем проблема, и добавил в фреймворк следующие строки.ямл и все остальное работало.

 when@test:
    framework:
        test: true
        session:
            storage_factory_id: session.storage.factory.mock_file