Security的用户认证信息默认是存储在session中的,对于session过期的时间,springboot的里默认的是30分钟。
当然也可以自己设置:
application.yml:
server:
session:
timeout: 7200 #最少是一分钟,就算比一分钟少也会默认转成一分钟,如果不设置默认为30分钟
security的session管理:
SessionManagementConfigurer的其他属性
//默认的session认证策略:ChangeSessionIdAuthenticationStrategy,用来放置固定的会话攻击
private final SessionAuthenticationStrategy DEFAULT_SESSION_FIXATION_STRATEGY = createDefaultSessionFixationProtectionStrategy();
private SessionAuthenticationStrategy sessionFixationAuthenticationStrategy = this.DEFAULT_SESSION_FIXATION_STRATEGY;
private SessionAuthenticationStrategy sessionAuthenticationStrategy;
private SessionAuthenticationStrategy providedSessionAuthenticationStrategy;
/**
* 无效的session策略:确定在{@code SessionManagementFilter}中提交和检测到无效会话ID时{@code SessionManagementFilter}的行为。
* 默认是重定向到invalidSessionUrl
*/
private InvalidSessionStrategy invalidSessionStrategy;
/**
* 在{@code ConcurrentSessionFilter}中检测到过期的会话时,确定{@code ConcurrentSessionFilter}的行为。
*/
private SessionInformationExpiredStrategy expiredSessionStrategy;
private List<SessionAuthenticationStrategy> sessionAuthenticationStrategies = new ArrayList<SessionAuthenticationStrategy>();
/**
* 维护一个 SessionInformation 实例的注册表。
* 包括session的创建,刷新,删除获取等
*/
private SessionRegistry sessionRegistry;
/**
* 最大session连接数
*/
private Integer maximumSessions;
/**
* session过期跳转的url
*/
private String expiredUrl;
/**
* 达到最大session值是否阻止登陆
*/
private boolean maxSessionsPreventsLogin;
/**
* 指定Spring Security的各种会话创建策略。
* 默认是需要就创建
*/
private SessionCreationPolicy sessionPolicy = SessionCreationPolicy.IF_REQUIRED;
/**
* 是否允许将session信息重写入url中。
* 默认是false,这样可以防止向外部域泄露信息。
*/
private boolean enableSessionUrlRewriting;
/**
* session无效时候跳转的url
*/
private String invalidSessionUrl;
/**
* session认证错误的url
*/
private String sessionAuthenticationErrorUrl;
/**
* 认证失败的handler
*/
private AuthenticationFailureHandler sessionAuthenticationFailureHandler;
用户可以根据自己需求配置对应的策略和session失效时候的跳转
session的集群管理。这里使用的是redis
pom导入依赖
<!-- session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
添加redis配置:最后的application.yml
spring:
#mysql
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.31.26:3306/test?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
username: root
password: root
#jpa
jpa:
hibernate:
ddl-auto: update #第一次是创建
show-sql: true
#spring session存储类型
session:
store-type: REDIS
#redis
redis:
host: 192.168.31.109
port: 6379
password: 123456
#session超时时间
server:
session:
timeout: 7200 #最少是一分钟,就算比一分钟少也会默认转成一分钟,如果不设置为30分钟
测试结果:
Logout功能
1.使当前session失效
2.消除与当前用户相关的remember-me记录
3.清空当前的SecurityContext
4.重定向到登录页
首页index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>首页</h3>
<a href="/logout">退出</a>
</body>
</html>
添加登出配置
.logout()
.logoutUrl("/logout") //登出路径
.logoutSuccessUrl("/login.html") //登出成功跳转到登陆页面
.deleteCookies("JSESSIONID") //删除cookie
.and()
测试过程略
源码地址:
https://gitee.com/mengcan/SpringSecurity.git