SpringSecurity rememberme功能实现过程解析

作者:天宇轩-王 时间:2021-12-20 05:22:08 

记住我功能原理分析

还记得前面咱们分析认证流程时,提到的记住我功能吗?

SpringSecurity rememberme功能实现过程解析

现在继续跟踪找到AbstractRememberMeServices对象的loginSuccess方法:

SpringSecurity rememberme功能实现过程解析

再点进去上面if判断中的rememberMeRequested方法,还在当前类中:

SpringSecurity rememberme功能实现过程解析

如果上面方法返回true,就表示页面勾选了记住我选项了。

继续顺着调用的方法找到PersistentTokenBasedRememberMeServices的onLoginSuccess方法:

SpringSecurity rememberme功能实现过程解析

注意name和value属性的值不要写错哦!

SpringSecurity rememberme功能实现过程解析

先测试一下,认证通过后,关掉浏览器,再次打开页面,发现还要认证!为什么没有起作用呢?
这是因为remember me功能使用的过滤器RememberMeAuthenticationFilter默认是不开启的!

开启remember me过滤器


<security:remember-me token-validity-seconds="60"></security:remember-me>

说明:RememberMeAuthenticationFilter * 能非常简单,会在打开浏览器时,自动判断是否认证,如果没有则
调用autoLogin进行自动认证。

SpringSecurity rememberme功能实现过程解析

remember me 安全性分析

记住我功能方便是大家看得见的,但是安全性却令人担忧。因为 Cookie毕竟是保存在客户端的,很容易盗取,而且
cookie的值还与用户名、密码这些敏感数据相关,虽然加密了,但是将敏感信息存在客户端,还是不太安全。那么
这就要提醒喜欢使用此功能的,用完网站要及时手动退出登录,清空认证信息。

此外,SpringSecurity还提供了remember me的另一种相对更安全的实现机制 :在客户端的cookie中,仅保存一个
无意义的加密串(与用户名、密码等敏感数据无关),然后在db中保存该加密串-用户信息的对应关系,自动登录
时,用cookie中的加密串,到db中验证,如果通过,自动登录才算通过。

持久化remember me信息

创建一张表,注意这张表的名称和字段都是固定的,不要修改。


<security:remember-me token-validity-seconds="60"
              data-source-ref="dataSource"
    remember-me-parameter="remember-me"></security:remember-me>

CREATE TABLE `persistent_logins` (
`username` varchar(64) NOT NULL,
`series` varchar(64) NOT NULL,
`token` varchar(64) NOT NULL,
`last_used` timestamp NOT NULL,
PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

SpringSecurity rememberme功能实现过程解析

来源:https://www.cnblogs.com/dalianpai/p/12378075.html

标签:Spring,Security,rememberme
0
投稿

猜你喜欢

  • Java8 Lambda表达式详解及实例

    2023-02-06 20:59:15
  • SpringBoot 配合 SpringSecurity 实现自动登录功能的代码

    2023-07-22 04:58:22
  • Java中Date日期时间类具体使用

    2022-04-11 23:18:13
  • Java overload和override的区别分析

    2023-10-12 15:16:17
  • java泛型详解

    2023-06-07 23:54:47
  • SpringBoot利用拦截器实现避免重复请求

    2022-02-07 00:21:53
  • 使用mybatis插件PageHelper实现分页效果

    2023-03-29 15:12:03
  • Spring Cloud中FeignClient实现文件上传功能

    2023-06-23 07:57:09
  • Java之操作Redis案例讲解

    2023-06-18 03:48:41
  • Java实现读写文件功能的代码分享

    2023-02-07 04:07:02
  • 总结Java集合类操作优化经验

    2023-01-27 10:29:37
  • Java函数式编程(八):字符串及方法引用

    2022-05-02 22:28:23
  • spring框架集成flyway项目的详细过程

    2023-09-14 11:47:14
  • Android实现支付宝支付密码输入界面

    2023-06-20 14:57:15
  • springMvc注解之@ResponseBody和@RequestBody详解

    2022-10-09 17:57:19
  • Java遗传算法之冲出迷宫

    2022-01-12 21:34:58
  • Java虚拟机内存区域划分详解

    2023-06-20 22:04:24
  • 详解java中String、StringBuilder、StringBuffer的区别

    2023-06-17 06:03:23
  • JVM内存模型/内存空间:运行时数据区

    2023-01-14 13:12:23
  • java 保留两位小数的几种方法

    2022-05-11 16:38:27
  • asp之家 软件编程 m.aspxhome.com