You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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变量始终为空。
问题原因与解决方案

核心原因

  1. PHPUnit测试客户端默认请求host为localhost,不满足front防火墙的app.mydomain.localhost规则,导致请求不会进入对应防火墙的认证上下文,loginUser设置的认证信息无法被识别。
  2. 测试环境下,若请求未携带正确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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:18:23