Symfony7功能测试中loginUser子域名认证失败排查
问题描述
技术栈:Symfony 7 / PHP 8.3 / PHPUnit 9.6
配置了多个带子域名的防火墙,其中front防火墙的host规则为^(app\.mydomain\.localhost)|(app\.mydomain)$,匹配/front路径,使用json_login认证。
在PHPUnit测试中调用$this->client->loginUser($testUser)后,后续访问需登录的路由时提示**“Full authentication is required to access this resource”**错误。已做以下配置:
framework.yaml中配置session.cookie_domain为.mydomain.localhost,测试环境同步配置- 尝试在
phpunit.xml中添加session.cookie_domain配置
但查看loginUser函数代码时发现$domains变量始终为空。
问题原因与解决方案
核心原因
- PHPUnit测试客户端默认请求host为
localhost,不满足front防火墙的app.mydomain.localhost规则,导致请求不会进入对应防火墙的认证上下文,loginUser设置的认证信息无法被识别。 - 测试环境下,若请求未携带正确host,
loginUser无法正确读取cookie域名配置,导致$domains变量为空,session cookie无法在子域名下生效。
解决办法
请求时指定正确host:
每次调用$client->request()时,通过server参数传入目标host:$this->client->request( 'GET', '/front/protected-route', [], [], ['HTTP_HOST' => 'app.mydomain.localhost'] );登录时指定对应防火墙:
调用loginUser时传入防火墙名称,确保认证信息绑定到正确的防火墙上下文:$this->client->loginUser($testUser, 'front'); // 后续所有请求必须带上上述正确的HTTP_HOST明确测试环境的session配置:
在config/packages/test/framework.yaml中添加或修改session配置:framework: session: cookie_domain: '.mydomain.localhost' storage_factory_id: session.storage.factory.mock_file
内容的提问来源于stack exchange,提问作者pop_up
相关产品推荐
相关产品推荐

