0%

SpringBoot 3.x / Spring Security 6.x 不自动保存 SecurityContext 处理

这两天有时间, 把我的博客升级到了 SpringBoot 3, 其中依赖的 Spring Security 也需要使用 6.x 的版本.

我的博客管理后台使用的是 vue 做前台页面的前后台分离方案, 登陆后 Session 保存登录信息.

高高兴兴迁移之后发现, 之前的代码登录之后不能保存鉴权信息, 每次登录能够成功, 但是下一个请求过来就找不到 SecurityContext 报错需要登录.

一开始以为是 BUG, 经过一番百度后发现网上寥寥无几的几篇文章提到的相同的问题, 给的解决方案要么是切换 JWT, 要么就是自定义实现各种过滤器, 最靠谱的方案是说要在登录成功的 LogoutSuccessHandler 处理中手动加上一句:

request.session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());

意思新版本的 Spring Security 不会自动保存 SecurityContext 了, 需要手动存一下.

作为重度强迫症患者这能忍? Spring 家族这么成熟的框架, 怎么可能允许这么蹩脚的方法, 那一定得通过配置来搞定啊~

后面去 Spring Security 一番阅读理解, 发现其实很简单:


@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    fun securityFilterChain (http: HttpSecurity): SecurityFilterChain {
        return http
             ...
            .securityContext()
            .requireExplicitSave(false)
            .and()
             ...
            .build()
    }
}

就这一句就行了, 也证实了新版 Spring Security 为了减小损耗确实默认不将 SecurityContext 存储在 HttpSession 中了.

至此, 我的搭载了 Springboot 3 的博客终于上线了~!

博客源码: https://github.com/lx0758/Blog
参考链接: https://docs.spring.io/spring-security/reference/migration/servlet/session-management.html

  • 本文作者: 6x
  • 本文链接: https://6xyun.cn/article/162
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!