我们在登录的时候经常会有remember me的按钮,其实Spring Security也给我们提供了记住我的功能。
我们根据上一篇的架构继续我们的开发。

增加Remember-me功能

我们这里的remember-me的功能是直接将token存储到数据库中的,还有一种方法是将token存储到内存中,这里讲不再讲述。

什么是Remember me?

简单的说,remember me其实就是我们在下次登录的时候可以不需要密码,直接访问即可,注意,这里不同于登录时设置过期时间,就是说一直登录的时候,强迫用户重新登录。这里我就在这里尝试了很多遍,为什么我设置remember-me的过期时间是10s,但是我登录成功后,等待了20s之后,还是可以继续访问。这其实是一个误区,我已经登录成功了,remember-me即使过期表示的是下一次登录的时候需要输入用户和密码,这里并不控制当前登录的强制退出。

一,修改login.html

在之前的remember-me按钮中添加remember-me按钮

  • 注意:
    这里的name必须是remember-me,不能随意改变
    <div>记住我:<input type="checkbox" name="remember-me"/></div>
二,新增数据库表

其实这里我们可以不自动进行新增,如果我们不进行新增的话需要在声明PersistentTokenRepository的bean的时候添加

tokenRepository.setCreateTableOnStartup(true);

这个的意思是token表不存在的话,我们可以自动在数据库中创建该表,如果数据库中已经存在token表,那么就不能写,否则程序报错。

  • 数据库表的添加
CREATE TABLE `persistent_logins` (`username` varchar(64) NOT NULL,`series` varchar(64) NOT NULL,`token` varchar(64) NOT NULL,`last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里的字段和表名是固定的。

三,修改WebSecurityConfig的配置类

(1)注入DataSource

@Autowired
private DataSource dataSource;

(2)新增PersistentTokenRepository的bean用来处理rememer me操作

    /*** 用来做remember me的处理*/@Beanpublic PersistentTokenRepository persistentTokenRepository(){JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();// 如果token表不存在,使用下面语句可以初始化该表;若存在,请注释掉这条语句,否则会报错。// tokenRepository.setCreateTableOnStartup(true);tokenRepository.setDataSource(dataSource);return tokenRepository;}

如果我们需要spring Security自动帮我们创建token表就是在这里进行添加。
上面代码的作用就是添加数据源,datasource,这里的DataSource我们没有进行显示配置,所以用的是spring boot给我们默认提供的datasource。

四,设置我们的登录行为
    /*** 定制登陆行为* @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login").defaultSuccessUrl("/sayHello").permitAll().and().logout().permitAll()// 自动登录的校验.and().rememberMe().tokenRepository(persistentTokenRepository())// 声明有效时间,单位是s.tokenValiditySeconds(60)// 进行校验的service.userDetailsService(userDetailsService);// 关闭CSRFhttp.csrf().disable();}

这里我们添加了remember()功能,向其中注入了我们自己的persistentTokenRepository类,并且规定了他的过期时间,并注入我们自己实现的校验类CustomUserDetailsService。

五, 浏览器测试

(1)登陆成功后,在remember过期之前关闭浏览器,重新访问受限制的url,可以进行访问,因为remember me未超时
(2)登录成功后,在remember过期后关闭浏览器,重新访问受限制的url,自动跳转到登录页面,因为remember me超时
(3)登录成功后观察浏览器的cookie

(4)登录成功后,观察数据库的token表

(5)当时间过期之后,浏览器的cookie自动删除,但是数据库的token表不删除该记录

发现已经没有key是remember-me的cookie,但是数据库中该记录一直存在
(6)当logout后,正常退出后,数据库将该token记录删除。

Remember-me原理

我们这里使用数据库的持久化进行remember操作,注意这里的校验是:在客户端的Cookie中,保存一个无意义的加密串,该加密串和用户名密码都没有关系,然后在数据库中保存该加密串-用户信息的对应关系,自动登录的时候,用cookie中的加密串,到数据库中验证,如果通过自动登录才算通过。

  • 基本原理


当浏览器发起登录请求的时候,会先进入UsernamePasswordAuthenticationFilter过滤器,当认证通过后进过RememberService里面,其中的TokenRepository·,他会产生一个token,首先将token写入到浏览器cookie中,然后将token,认证成功的用户名写入到数据库中。
当浏览器下次请求时,会经过 RememberMeAuthenticationFilter,它会读取 Cookie 中的 token,交给 RememberMeService 从数据库中查询记录。如果存在记录,会读取用户名并去调用 UserDetailsService,获取用户信息,并将用户信息放入Spring Security 中,实现自动登陆。

注意:

RememberMeAuthenticationFilter 是在整个过滤链的位置比较后,所以这种登录方式是在所有传统的登录方式都无法登录的时候才会使用的自动登录。

Spring Security(2)——remember me相关推荐

  1. SpringBoot集成Spring Security(二)注册 、密码加密、修改密码

    SpringBoot集成Spring Security(一)登录注销 写在前面 上一节创建了项目并且利用Spring Security完成了登录注销功能,这里继续说一下注册.密码加密和找回密码,代码注 ...

  2. SpringBoot集成Spring Security(一)登录注销

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! SpringBoot集成Spring Security(二)注册 .密码加密.修改密码 写在前面 Spring S ...

  3. SpringBoot集成Spring Security(2)——自动登录

    在上一章:SpringBoot集成Spring Security(1)--入门程序中,我们实现了入门程序,本篇为该程序加上自动登录的功能. 文章目录 一.修改login.html 二.两种实现方式 2 ...

  4. Spring Boot 学习之路之 Spring Security(二)加入mybatis

    上一篇 Spring Security 基础配置:  http://t.csdn.cn/m9oq5​​​​​​​ 在上文Spring Boot 学习之路之 Spring Security(一)中完成了 ...

  5. 手把手教你如何使用Spring Security(上):登录授权

    文章目录 一.什么是 Spring Security? 官方介绍 通俗来讲 二.初始搭建 创建 启动 三.项目原理 原理 思考 四.登录认证 登录过滤器 配置过滤器链 类补充 五.登录效果 效果演示 ...

  6. 深入浅出Spring Security(三):FilterChainProxy的运行过程

    上篇回顾 我们已经知道了Spring Security的核心过滤器的创建和原理,本文主要介绍核心过滤器FilterChainProxy是如何在tomcat的ServletContext中生效的. Se ...

  7. Spring security (一)架构框架-Component、Service、Filter分析

      想要深入spring security的authentication (身份验证)和access-control(访问权限控制)工作流程,必须清楚spring security的主要技术点包括关键 ...

  8. Spring Security(18)——Jsp标签

    目录 1.1     authorize 1.2     authentication 1.3     accesscontrollist Spring Security也有对Jsp标签的支持的标签库 ...

  9. SpringBoot集成Spring Security(3)——异常处理

    源码地址:https://github.com/jitwxs/blog_sample 文章目录 一.常见异常 二.源码分析 三.处理异常 不知道你有没有注意到,当我们登陆失败时候,Spring sec ...

  10. SpringBoot集成Spring Security(1)——入门程序

    因为项目需要,第一次接触 Spring Security,早就听闻 Spring Security 功能强大但上手困难,学习了几天出入门道,特整理这篇文章希望能让后来者少踩一点坑(本文附带实例程序,请 ...

最新文章

  1. OpenCV-Python:模板匹配
  2. java 文件保存目录结构_java web 实现文件夹上传(保留目录结构)
  3. MVC Scaffolding SmartCode-Engine 更新
  4. java在frame怎么计时_java – 退出jframe时的Swing stop计时器
  5. oracle中文字段名怎么查询_sql注入联合查询总结
  6. 虚拟化Hadoop集群的部署和管理 - 基本操作
  7. 字节流和字符流学习笔记:
  8. macos 判断走无线网还是有线网_“第一次约会,就想发生关系”:怎样判断男人对你走心还是走肾?...
  9. [CF280D]k-Maximum Subsequence Sum
  10. 【Alpha】“北航社团帮”小程序v1.0发布声明
  11. 用python重温统计学基础:描述性统计分析
  12. 魔域手游安卓修改服务器地址,魔域手游服务端商业版
  13. 如何用python进行数据处理?(一)
  14. 图基(Tukey)检验
  15. fatal: unable to access ‘https://github xxxxxxxxx的解决方法
  16. [Java]Spring Ioc讲解,不怕你不懂
  17. 一个测试经理/测试主管/测试总监的工作总结
  18. 完整的PRD文档包含哪些内容?
  19. 小米手机安装linux视频教程,屏幕失灵的小米5手机安装linuxdeploy centos7记录
  20. 成人的世界,时间也是一种昂贵的成本

热门文章

  1. 无界文档| 我们尝试让文档变得更有格调一点!
  2. uni-app学习笔记之163邮箱自动发邮件
  3. Python学习Day1
  4. Xshell 上下左右键乱码问题
  5. excel 连接 mysql数据库 提示 连接器 需要安装 组件
  6. Python injector 依赖注入框架使用
  7. 钱币兑换问题 多少可能;
  8. 如何在 Linux 下删除分区 ?
  9. 圣诞礼物有哪些蓝牙耳机推荐?圣诞送礼选这几款高性价比蓝牙耳机
  10. 详细完整——XP系统硬盘安装Ubuntu14.04