Spring Security会话超时测试策略踩坑记录
最近在为一个Spring Boot微服务项目做安全测试时,遇到了一个令人头疼的会话超时问题。项目使用了Spring Security,默认配置下,用户登录后如果超过30分钟未操作,系统会自动退出登录。
问题复现步骤
- 启动应用后,通过POST
/login接口进行用户认证 - 获取到JWT Token后,立即访问受保护的接口
/api/user/profile - 等待30分钟后,再次访问同一接口
- 期望返回401未授权状态码,但实际响应了正常数据
测试用例设计
@Test
public void testSessionTimeout() {
// 登录获取token
String token = loginAndGetToken();
// 验证登录后能访问受保护资源
mockMvc.perform(get("/api/user/profile")
.header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
// 模拟会话超时(这里需要模拟时间跳转)
// 重点:这里测试了时间跳转后的验证
mockMvc.perform(get("/api/user/profile")
.header("Authorization", "Bearer " + token))
.andExpect(status().isUnauthorized());
}
根本原因分析
经过排查发现,问题出在我们的测试环境配置上。由于使用了@MockBean模拟了SecurityContext,导致实际的会话超时逻辑没有被触发。最终通过增加@WithMockUser注解和正确配置SecurityFilterChain来解决。
测试覆盖率数据
- 单元测试覆盖率:85%
- 集成测试覆盖率:92%
- 整体代码覆盖率:78%(包含测试用例)

讨论