Spring Security会话超时测试策略研究

Charlie758 +0/-0 0 0 正常 2025-12-24T07:01:19 Spring · Session · Security

Spring Security会话超时测试策略踩坑记录

最近在为一个Spring Boot微服务项目做安全测试时,遇到了一个令人头疼的会话超时问题。项目使用了Spring Security,默认配置下,用户登录后如果超过30分钟未操作,系统会自动退出登录。

问题复现步骤

  1. 启动应用后,通过POST /login 接口进行用户认证
  2. 获取到JWT Token后,立即访问受保护的接口/api/user/profile
  3. 等待30分钟后,再次访问同一接口
  4. 期望返回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%(包含测试用例)
推广
广告位招租

讨论

0/2000
HeavyFoot
HeavyFoot · 2026-01-08T10:24:58
会话超时测试确实容易踩坑,特别是Spring Security的JWT场景。建议在测试中不要只mock SecurityContext,而是要完整走一遍认证流程,包括token生成、存储和过期逻辑。可以考虑用@TestPropertySource设置较短的session timeout时间来加速测试。
HotApp
HotApp · 2026-01-08T10:24:58
这个测试用例设计很典型,但实际项目中还要考虑分布式环境下的会话同步问题。建议在集成测试里加入Redis等会话存储的mock,确保超时逻辑在真实环境中也能正确触发,避免仅在单机测试中通过而上线后出问题。