Spring Security(5)

本文介绍了如何使用Spring Security实现Remember-Me功能,即用户在登录后一段时间内无需再次输入密码。首先展示了通过修改WebSecurityConfiguration配置简单实现基于cookie的Remember-Me,然后详细解释了如何将Remember-Me信息存储到数据库中,确保服务关闭后仍能生效。此外,还提到了数据库表的设计以及相关配置代码。最后,文章提及了Remember-Me的失效规律,并预告了下一次将讨论使用NoSQL实现Remember-Me。

 

您好,我是湘王,这是我的优快云博客,欢迎您来,欢迎您再来~

经常上网的人都应该有这样的体验:很多网站或者APP只需要第一次登录时输入用户名和密码之后,后面很长一段时间内就不需要再次输入密码了。这确实是一个非常好的体验,不然每次都让人输用户名和密码就太麻烦了。

Spring Security也提供了这样的功能,也就是Remember-Me(记住我)。

要实现这个功能也异常简单:只需要稍稍修改一下WebSecurityConfiguration即可:

// 控制逻辑
@Override
protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests()
			.anyRequest().authenticated()
			// 设置自定义认证成功、失败及登出处理器
			.and().formLogin().loginPage("/login")
			.successHandler(successHandler).failureHandler(failureHandler).permitAll()
			.and().logout().logoutUrl("/logout").deleteCookies("JSESSIONID")
			.logoutSuccessHandler(logoutSuccessHandler).permitAll()
			// 配置无权访问的自定义处理器
			.and().exceptionHandling().accessDeniedHandler(accessDeniedHandler)
			// 记住我
			.and().rememberMe()
			.and()
			.cors().and().csrf().disable();
}

在postman的参数中增加remember-me参数,并设为true再访问就行了:

 

结果也很清楚:

 

虽然用cookie实现记住我很方便,但是如果涉及到敏感信息的话,cookie太过简单满足不了需求。所以,Spring Security提供了另外一种实现机制:保存到数据库中。也就是自动登录时,用cookie中的加密串到数据库中验证,如果通过,自动登录才算成功。使用这种方式实现remember-me很简单,只需要在WebSecurityConfiguration中增加一段代码就行了:

// 控制逻辑
@Override
protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests()
			.anyRequest().authenticated()
			// 设置自定义认证成功、失败及登出处理器
			.and().formLogin().loginPage("/login")
			.successHandler(successHandler).failureHandler(failureHandler).permitAll()
			.and().logout().logoutUrl("/logout").deleteCookies("JSESSIONID")
			.logoutSuccessHandler(logoutSuccessHandler).permitAll()
			// 配置无权访问的自定义处理器
			.and().exceptionHandling().accessDeniedHandler(accessDeniedHandler)
			// 记住我
			.and().rememberMe()
			// 数据库保存,这种方式在关闭服务之后仍然有效
			.tokenRepository(persistentTokenRepository())
			// 默认的失效时间会从用户最后一次操作开始计算过期时间,过期时间最小值就是60秒,
			// 如果设置的值小于60秒,也会被更改为60秒
			.tokenValiditySeconds(30 * 24 * 60 * 60)
			.and()
			.cors().and().csrf().disable();
}

因为需要在数据库中保存,那么自然就需要创建相应的数据库表:

 

同样,在WebSecurityConfiguration中再加入如下代码(需要注意的是,datasource是不能够通过连接池得到的,这里连接池注入的是javax.sql.DataSource):

// 如果使用hikariCP这里就无法注入DataSource
@Autowired
private DataSource dataSource;

// MySQL方式实现记住我
@Bean
public PersistentTokenRepository persistentTokenRepository() {
	// mysql方式
	JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
	// 需要给JdbcTokenRepositoryImpl注入一个数据源,实现CRUD
	tokenRepository.setDataSource(dataSource);
	return tokenRepository;
}

这样就可以了,然后运行postman进行测试。

可以看到,由于是60秒失效,因此在第一次访问60秒后,再调用同样的接口时,名称为remember-me的cookie消失了。数据库的persistent_logins表中也多了一条用户访问记录。

失效规律:

1、过期时间的最小值是60秒,如果设置的值小于60秒,也会被更改为60秒;

2、默认的失效时间会从用户最后一次操作开始计算过期时间。

MySQL虽然方便,但是一般MySQL是用来保存主要业务数据的,这种技术性的数据最好不要和业务混在一起。所以,下一次就来说说怎么用NoSQL实现记住我。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值