「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。
作者:汤圆
个人博客:javalover.cc
简介
本篇主要介绍SpringSecurity中管理Session的相关知识,包括Session的创建、超时、预防攻击等策略
目录
- Session的创建时机
- Session的并发控制
- Session的过期管理
- Session的预防攻击策略
正文
1. Session的创建时机
Session的创建时机有4种,分别为:
- always: 只要不存在就会创建
- ifRequired(默认): 只有在需要的时候才会创建
- never: Spring Security本身不创建Session,但是如果已经存在了,那么Spring Security也会使用
- stateless: Spring Security既不创建也不使用Session
下面我们用代码来进行配置:如下所示
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
}
复制代码
注意:这里我们只是配置了Spring Security如何创建Session,但是Spring的其他应用怎么创建Session跟这里是没关系的。
如果是SpringSecurity创建的Session,则会有下面的属性:SPRING_SECURITY_CONTEXT
,以区分其他的Session
2. Session的并发控制
同一个用户连续认证多次,对于Session控制来说,有两种不同的处理方式:
- 新的Session替换旧的Session
- 新的Session和旧的Session并存
我们可以注册一个Bean: HttpSessionEventPublisher,用来监听 Session,这样当Session被销毁时会通知给我们
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
复制代码
同一个用户多个Session并存的配置方式:这里配置了允许2个 Session 同时存在
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2)
}
复制代码
3. Session的过期管理
Session的过期时间可以在 application.yml 中配置:这里配置的15分钟过期(单位默认秒)
server.servlet.session.timeout=15m
复制代码
当 Session 过期或者失效时,可以将接收的请求重定向到特定的页面,配置如下所示:
http.sessionManagement()
.expiredUrl("/sessionExpired.html")
.invalidSessionUrl("/invalidSession.html");
复制代码
4. Session的预防攻击策略
Session的伪造攻击大概的一个流程就是:
- 我先去访问一个网站,会返回一个jsessionid;
- 我把
网站链接+jsessionid
发送给你,你去登录这个网站; - 这样你登录之后,相当于给我授权了,我就可以进入你的后台;此时我们俩共用同一个session
那要怎么预防这种攻击呢?
SpringSecurity提供了三种策略
- 不失效旧的Session:原来的Session还是合法的(不建议,只适用于系统已有其他的防御机制时)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionFixation()
.none()
}
复制代码
- 失效旧的session:同时创建新的Session,但是不迁移旧的session中的属性:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionFixation()
.newSession()
}
复制代码
- 迁移Session(默认):将旧的Session中的属性迁移到新的Session中,并使旧的Session失效
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionFixation()
.migrateSession()
}
复制代码
总结
本篇介绍了SpringSecurity中管理Session的相关知识,包括创建时机、并发控制、过期管理、预防攻击策略等;
但是通篇理论居多,实践偏少,后面还是要多整理一些实践方面的例子,配合理论会更加容易理解;