session会话相关
1.设置springSecurity创建session的策略
实现:继承WebSecurityConfigurerAdapter ,重写configure(HttpSecurity http) 方法
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionCreationPolicy(
SessionCreationPolicy.IF_REQUIRED
)
}
public enum SessionCreationPolicy {
/** Always create an {@link HttpSession}
session */
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
}
2.设置session超时时间
- server.servlet.session.timeout=15m
- spring.session.timeout = 15m
后者的优先级高
3.会话超时处理
超时的session也是不合法的session
http.sessionManagement()
.invalidSessionUrl("/invalidSession.html");
4.Spring Security的会话固化保护
该功能的目的是一定程度上防止非法用户窃取用户session及cookies信息,进而模拟session的行为。
默认情况下,Spring Security启用了migrationSession保护方式。即对于同一个cookies的SESSIONID用户,每次登录验证将创建一个新的HTTP会话,旧的HTTP会话将无效,并且旧会话的属性将被复制。
http.sessionManagement() .sessionFixation().migrateSession()
如果这不是您需要的方式,则可以使用其他两个选项:
- 设置为“none”时,原始会话不会无效
- 设置“newSession”后,将创建一个干净的会话,而不会复制旧会话中的任何属性
5.提高Cookie的安全
server.servlet.session.cookie.http-only=true
server.servlet.session.cookie.secure=true
- httpOnly:如果为true,则浏览器脚本将无法访问cookie
- secure:如果为true,则仅通过HTTPS连接发送cookie,HTTP无法携带cookie。
6.限制最大用户登录数量
.sessionManagement()
.maximumSessions(1)//表示同一个用户最大的登录数量
.maxSessionsPreventsLogin(false)//true表示已经登录就不予许再次登录,false表示允许再次登录但是之前的登录会下线
.expiredSessionStrategy(new xxxExpiredSessionStrategy())//表示自定义一个session被下线(超时)之后的处理策略 这个类是一个实现SessionInformationExpiredStrategy ,重写
onExpiredSessionDetected(SessionInformationExpiredEvent event)