如何在 Symfony 5 中测试访问控制系统?

Posted

技术标签:

【中文标题】如何在 Symfony 5 中测试访问控制系统?【英文标题】:How to do test the access control system in Symfony 5? 【发布时间】:2021-11-08 14:39:16 【问题描述】:

我正在使用新的 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 个错误:

    App\Tests\Functional\HomeTest::testGuest Symfony\Component\Security\Core\Exception\AccessDeniedException: 访问被拒绝。

C:\Users\webgr\projects\project-manager\manager\vendor\symfony\security-http\Firewall\AccessListener.php:112 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\security-http\Firewall\AccessListener.php:106 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\security-bundle\Debug\WrappedLazyListener.php:49 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\security-bundle\Security\LazyFirewallContext.php:60 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\security-bundle\Debug\TraceableFirewallListener.php:59 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\security-http\Firewall.php:86 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\event-dispatcher\Debug\WrappedListener.php:117 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\event-dispatcher\EventDispatcher.php:230 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\event-dispatcher\EventDispatcher.php:59 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\event-dispatcher\Debug\TraceableEventDispatcher.php:151 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\http-kernel\HttpKernel.php:132 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\http-kernel\HttpKernel.php:78 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\http-kernel\Kernel.php:199 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\http-kernel\HttpKernelBrowser.php:65 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\framework-bundle\KernelBrowser.php:169 C:\Users\webgr\projects\project-manager\manager\vendor\symfony\browser-kit \AbstractBrowser.php:402 C:\Users\webgr\projects\project-manager\manager\tests\Functional\HomeTest.php:15

为什么我不能测试“访问控制”?

为什么我在测试时收到 500 服务器错误而不是简单的重定向 302?

我很乐意接受任何建议。

提前谢谢你。

这是我想补充的另一件事,这些信息很可能是决定性的。我的网站使用 https 运行。

【问题讨论】:

【参考方案1】:

最后,我找出了问题所在,我在 framework.yaml 中添加了以下几行,一切正常。

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

【讨论】:

以上是关于如何在 Symfony 5 中测试访问控制系统?的主要内容,如果未能解决你的问题,请参考以下文章

通过单元测试访问 Symfony 2 容器?

如何使用 phpunit 在 Symfony 中测试控制器方法?

Symfony2 - 如何在自定义控制台命令中访问服务?

API 平台 Symfony 5 JWT 访问控制

Symfony |如何从控制器中的存储库访问自定义方法?

Symfony 5,测试条带时得到 403