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

Symfony 4 PHPUnit功能测试完成登录配置后访问受保护路由仍302跳转登录页

问题现象
  • 执行Symfony功能测试时,受保护路由始终返回302状态码,自动重定向至登录页面
  • 已按照对应版本官方文档提供的测试认证逻辑编写代码,确认测试所用的用户数据、角色权限配置正确,调整过防火墙相关配置仍未解决
  • 单测执行结果提示:Failed asserting that 302 matches expected 200.
  • 已验证:同测试类下的testShowLogin方法可以正常返回200状态码

具体问题原因与排查方向

1. 重复调用setUp清空测试状态

testShowProducts方法内部手动执行了$this->setUp(),这会重新创建全新的HTTP客户端、重新初始化内核状态,把之前所有挂载在客户端上的会话cookie、认证状态全部清空。

提示:PHPUnit框架会在每个独立测试方法执行前自动触发setUp流程,手动重复调用等于主动丢弃了之前完成的登录状态,后续发起的请求自然会被判定为未认证用户,触发重定向。

2. 防火墙配置参数硬编码错误

认证逻辑中硬编码了占位符值:

$firewallName = 'firewallName';
$firewallContext = 'firewallContext';

这两个参数必须和项目security.yaml中实际配置的防火墙名称、上下文名称完全一致。如果实际配置的防火墙名为main,这里传入的占位符字符串会导致写入会话的token完全不被框架识别,等于没有完成认证。

3. 跨防火墙的路径匹配问题

需要核对/account/list-product和/login两个路由是否归属同一个防火墙规则块。如果两个路由分属不同的防火墙上下文,就算会话中存储了某一个防火墙的认证token,跨上下文的请求也无法读取有效认证信息,触发未认证重定向。

4. 会话服务获取时机错误

从测试容器中获取会话服务时,必须确认内核已经完成启动初始化。Symfony 4.4及以上版本的测试专用容器,只有在内核完全加载后才会完成服务绑定,提前获取会话实例会导致写入的认证状态无法被后续请求读取。

修复参考

调整测试代码逻辑时需要做到:

  • 删除所有测试方法中手动调用的$this->setUp()代码,依赖PHPUnit的自动初始化流程
  • 将硬编码的防火墙名、上下文名替换为项目实际的配置值
  • 确认测试目标路由和登录路由归属同一个防火墙规则块
  • 确保登录逻辑在创建客户端之后执行,再为客户端写入会话cookie

内容的提问来源于stack exchange,提问作者Guillaume

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 03:27:04