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

Spring Boot3升级Redis索引会话:登录失败及重定向循环问题

Spring Boot 3.0.0升级中的Spring Security会话与认证问题

升级背景

将Spring Boot项目从2.7.5版本升级至3.0.0版本,核心工作为替换已废弃的WebSecurityConfigurerAdapter,开发语言为Kotlin(不影响组件运行)。

基础配置

新旧版本的安全配置类中,均声明了如下Autowired字段及对应Bean:

@Autowired
private lateinit var sessionRepository: FindByIndexNameSessionRepository<out Session>

@Bean
fun sessionRegistry(): SessionRegistry {
    return SpringSessionBackedSessionRegistry(sessionRepository)
}

初始启动问题

最初应用无法启动,Spring无法注入sessionRepository,将@EnableRedisHttpSession替换为@EnableRedisIndexedHttpSession后问题解决。

登录失败问题

当前无法正常登录系统,怀疑与Redis会话管理相关:

  • 可正常加载登录页并提交登录请求,日志显示认证成功
  • 重定向到主页后authentication为null,Redis中无该用户的认证记录

迁移前后SecurityFilterChain中的会话配置对比:

迁移前

.sessionManagement().sessionFixation().migrateSession().and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED).maximumSessions(1).sessionRegistry(sessionRegistry()).expiredUrl("/api/v1/logout").and()

迁移后

.sessionManagement { ssm ->
  ssm.sessionFixation { it.migrateSession() }
  ssm.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
    .maximumSessions(1).sessionRegistry(sessionRegistry()).expiredUrl("/api/v1/logout")
}

仅修改了pom.xml和安全配置类,未改动其他业务代码,询问缺失哪些配置以实现认证持久化。

更新1:调整注解后的情况

调整安全配置类注解如下:

@Configuration
@EnableWebSecurity
@EnableSpringHttpSession
@EnableRedisIndexedHttpSession(redisNamespace = "admindev:session", flushMode = FlushMode.IMMEDIATE, saveMode = SaveMode.ALWAYS)
class SecurityConfiguration(

提升Spring Security日志级别后,日志无异常信息,但会话令牌仍无法找到。

更新2:无限重定向循环问题

按相关方案调整后可访问前端,但后端登录时陷入无限重定向循环:

  • 应用尝试跳转到error/4xx页(因后端无"/"链接,属于预期行为)
  • 随后被会话过期页重定向,又因已登录状态跳转回"/",循环往复

相关异常处理配置如下:

http.exceptionHandling { e -> e.authenticationEntryPoint(LoginRedirectHandler()) }
//...
class LoginRedirectHandler : LoginUrlAuthenticationEntryPoint("/login") {
    override fun determineUrlToUseForThisRequest(
        request: HttpServletRequest,
        response: HttpServletResponse,
        exception: AuthenticationException?
    ): String {
        return "${this.loginFormUrl}?error=timeout&requestedUrl=${request.requestURL}"
    }
}

询问该行为变化的原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:40:44