SpringSecurity(六):Session(集群)管理和Logout

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



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值