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

经常上网的人都应该有这样的体验:很多网站或者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实现记住我。


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

最新文章

  1. 转:WCF、WebAPI、WCFREST、WebService之间的区别
  2. 可在广域网部署运行的QQ高仿版 -- GG叽叽V2.4,增加远程协助、桌面共享功能(源码)
  3. Recommending branded products from social media -RecSys 2013-20160422
  4. Could not find action or result
  5. C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
  6. Linux 权限相关
  7. Silverlight浮动窗体 floatablewindow 非模态对话框
  8. HTML5 ArrayBuffer:类型化数组 (二)
  9. Chapter 16_0 面向对象编程
  10. Python教程(2.5)——控制台输入
  11. Linux系统调用过程
  12. Image和Base64互相转换
  13. Dynamics 365执行操作报SQL Server已超时,更改这个超时设置的方法
  14. FineUI 相关
  15. React文档(十八)最佳性能
  16. excle中表引用
  17. bash的内置字符串处理工具
  18. 本地搭建Wordpress博客网站(Windows)
  19. 揭开Redis的神秘面纱
  20. DevExpress v18.1新版亮点——Reporting篇(四)

热门文章

  1. gem5 使用记录, 基于理解来写个最简单的计数器程序
  2. 天天写SQL,这些神奇的特性你知道吗?
  3. pod(一):Kubernetes(k8s)创建pod的两种方式
  4. Unity接入微信支付SDK 2022年版安卓篇
  5. 日志收集工具 Fluentd 使用教程
  6. CentOS 7.x 升级OpenSSH
  7. 【BotR】CLR堆栈遍历(Stackwalking in CLR)
  8. 关于aws-SecurityGroup-安全组策略的批量添加的方法记录
  9. 关于Azure-AzCopy在Linux环境下的安装
  10. Docker Private Registry