SpringSecurity学习 - Sessions管理

401 阅读3分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

作者:汤圆

个人博客:javalover.cc

简介

本篇主要介绍SpringSecurity中管理Session的相关知识,包括Session的创建、超时、预防攻击等策略

目录

  1. Session的创建时机
  2. Session的并发控制
  3. Session的过期管理
  4. 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

image-20220225174702247

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的伪造攻击大概的一个流程就是:

  1. 我先去访问一个网站,会返回一个jsessionid;
  2. 我把网站链接+jsessionid发送给你,你去登录这个网站;
  3. 这样你登录之后,相当于给我授权了,我就可以进入你的后台;此时我们俩共用同一个session

那要怎么预防这种攻击呢?

SpringSecurity提供了三种策略

  1. 不失效旧的Session:原来的Session还是合法的(不建议,只适用于系统已有其他的防御机制时)
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionFixation()
        .none()
}
  1. 失效旧的session:同时创建新的Session,但是不迁移旧的session中的属性:
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionFixation()
        .newSession()
}
  1. 迁移Session(默认):将旧的Session中的属性迁移到新的Session中,并使旧的Session失效
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionFixation()
        .migrateSession()
}

总结

本篇介绍了SpringSecurity中管理Session的相关知识,包括创建时机、并发控制、过期管理、预防攻击策略等;

但是通篇理论居多,实践偏少,后面还是要多整理一些实践方面的例子,配合理论会更加容易理解;