为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Security(5)

标签:
JAVA

您好,我是湘王,这是我的慕课手记,欢迎您来,欢迎您再来~


经常上网的人都应该有这样的体验很多网站或者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再访问就行了

https://img1.sycdn.imooc.com/637f6837000182fd08460315.jpg

 

结果也很清楚

https://img1.sycdn.imooc.com/637f68630001ab3208520431.jpg


虽然用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();
}

 

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

https://img1.sycdn.imooc.com/637f69c40001a8fe05530252.jpg


同样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实现记住我



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



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消