Spring Security 控制Session详情
控制什么时候创建Session
Spring Session中Session的创建机制:
机制 | 描述 |
---|---|
always | 如果没有session存在就创建一个 |
ifRequired | 如果需要就创建一个Session(默认) |
never | Spring Security将不会创建Session,但是如果应用中其他地方创建了Session,那么Spring Security将会使用它。 |
stateless | Spring Security将绝对不会创建Session |
Java 配置
@Override
protected void configure(HttpSecurity http) throws Exception {
// session 会话管理
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
}
public enum SessionCreationPolicy {
/** Always create an {@link HttpSession} */
ALWAYS,
/**
* Spring Security will never create an {@link HttpSession}, but will use the
* {@link HttpSession} if it already exists
*/
NEVER,
/** Spring Security will only create an {@link HttpSession} if required */
IF_REQUIRED,
/**
* Spring Security will never create an {@link HttpSession} and it will never use it
* to obtain the {@link SecurityContext}
*/
STATELESS
}
上边的配置只能控制Spring Security对session的创建,而不是控制整个应用Session的创建。
运行机制
在执行授权过程之前,Spring security将会运行一个filter(SecurityContextPersistenceFilter)来存储管理不同请求之间的context。这个Context将会有更具体的策略来进行存储,默认情况下HttpSessionSecurityContextRepository负责,它使用的是HttpSession。
最严格的创建条件下,将会使用NullSecurityContextRepository
并发Session的控制
并发Session指的是,已经授权过的用户再次进行授权。
并发Session的处理有两种方式:
- 使用新创建的Session,而丢弃旧的Session;
- 是多个Session同时存在;
通过Java Configuration来开启对并发Session的控制
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
这对于确保在销毁session时通知Spring Security注册中心是至关重要的。
允许一个用户有多个session是非常必要的,
@Override
public void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2);
}
Session过期设置
Spring Boot的配置文件中配置,Session的超时时间
server.servlet.session.timeout=10