这两天有时间, 把我的博客升级到了 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