SpringSecurity基础-记住我功能实现

简介: Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次访问该网站会默认登录成功,即使浏览器退出重新打开也是如此,这个功能需要借助浏览器的cookie实现,具体流程如下

1.理解记住我

1.1.什么是记住我

Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次访问该网站会默认登录成功,即使浏览器退出重新打开也是如此,这个功能需要借助浏览器的cookie实现,具体流程如下

1.2.记住我核心流程

在SpringSecurity中提供RememberMeAuthenticationFilter过滤器来实现记住我功能,其核心流程如下:

  1. 认证成功UsernamePasswordAuthenticationFilter会调用RememberMeServices创建Token
    (见其父类AbstractAuthenticationProcessingFilter.successfulAuthentication),同时 RemeberMeService 会调用TokenRepository将Token写入数据库(persistent_logins),然后 RemeberMeService通 过Reponse.addCookie把Token写到浏览器的Cookies中
  2. 当浏览器再次发起请求会进入RemeberMeAuthenticationFilter,该Filter获取到请求中的token交给RemeberMeService
  3. RemeberMeService调用TokenRepository去数据库中根据Token查询用户名
  4. 调用UserDetilasService.loadUserByUsername根据用户名获取用户认证信息
  5. 通过authenticationManager.authenticate,做一次认证,然后把用户信息放入上下文对象中

2.记住我功能实现

2.1.修改该登录页

增加记住我的选择框,注意name一定是”remember-me”

<divclass="checkbox"><label><inputtype="checkbox"id="rememberme"name="remember-me"/>记住我</label></div>

2.2.配置TokenRepository

PersistentTokenRepository是指明token的持久化方案(即用来存储“记住我”相关信息)。remember me功能是基于token,持久化方案有两种,一种基于内存,使用的是InMemoryTokenRepositoryImpl,一种基于数据库,使用的是JdbcTokenRepositoryImpl。这里我选择基于数据库的方式。

@AutowiredprivateDataSourcedataSource ;
@BeanpublicPersistentTokenRepositorypersistentTokenRepository(){
JdbcTokenRepositoryImplobj=newJdbcTokenRepositoryImpl();
obj.setDataSource(dataSource);
//obj.setCreateTableOnStartup(false);  //启动创建表persistent_logs表,存token,username时会用到returnobj;
}

配置持久化方案,用来存储“记住我”相关信息到数据库

如果:设置了“ obj.createTableOnStartUp(true);”之后会自动创建表persistent_logs,就不用再手动创建表,建议手动创建,因为我发现设置为true之后,每次启动都要重新创建。

2.3.配置RememberMe

修改认证服务配置WebSecurityConfig的 HttpSecurity配置,增加rememberMe

@AutowiredprivateUserDetailsServiceuserDetailsService;
http.rememberMe()
    .tokenRepository(persistentTokenRepository())   //持久    .tokenValiditySeconds(3600) //过期时间    .userDetailsService(userDetailsService); //用来加载用户认证信息的

2.4.创建persistent_logins 的表

注意,如果设置了 createTableOnStartUp(true); 就不用再执行该SQL

CREATETABLE `persistent_logins` (  `username` varchar(64)NOTNULL DEFAULT '',  `series` varchar(64)NOTNULL,  `token` varchar(64)NOTNULL,  `last_used` timestampNOTNULL DEFAULT CURRENT_TIMESTAMP ONUPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`series`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.5.测试

  • 访问登录页面进行登录,勾选记住我
  • 登录成功后,退出浏览器
  • 重新打开浏览器,直接访问资源-不需要登录就能访问
  • 如果你观察浏览器的cookie会发现一个Token,该Token和persistent_logins中存储的Token对应
目录
相关文章
|
安全 Java 数据库连接
Security自定义全局AuthenticationManager
Security自定义全局AuthenticationManager
607 1
|
安全 Java 数据库
【Spring Security】Spring Security 前后端分离认证
【Spring Security】Spring Security 前后端分离认证
541 0
|
存储 安全 前端开发
SpringBoot整合Spring Security + JWT实现用户认证
SpringBoot整合Spring Security + JWT实现用户认证的实现
7340 2
SpringBoot整合Spring Security + JWT实现用户认证
|
JavaScript 前端开发 数据安全/隐私保护
vue3+ts+elementplus写一个登录页面教程
【6月更文挑战第3天】本文介绍了如何使用 Vue 3 和 TypeScript 创建一个登录页面。首先,需安装 Vue CLI,然后创建新项目并启用 TypeScript 支持。接着,创建 `Login.vue` 组件,设计登录表单,包括用户账号、密码和验证码字段,并实现相关验证规则。页面样式包括背景、登录框和按钮等元素的布局与样式。最后,展示了`&lt;script&gt;`部分的代码,包括表单验证逻辑、生成验证码的函数以及登录提交处理。文章还提供了一个登录页面的截图和完整代码示例。
5620 1
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
1074 2
Spring Security 6.x OAuth2登录认证源码分析
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
29410 0
|
Java 编译器
Java“操作符 ... 不能应用于 x”解决
当Java编译器报错“操作符 ... 不能应用于 x”时,通常是因为你尝试对不支持该操作符的数据类型执行了操作。解决方法包括:确保数据类型兼容、使用正确的类型转换或选择合适的方法。检查代码中的变量类型和操作符使用是否正确。
206 4
|
安全 Java 开发者
Spring Security自定义认证异常和授权异常
Spring Security自定义认证异常和授权异常
1487 4
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】机器学习、深度学习、强化学习和迁移学习简介、相互对比、区别与联系。
机器学习、深度学习、强化学习和迁移学习都是人工智能领域的子领域,它们之间有一定的联系和区别。下面分别对这四个概念进行解析,并给出相互对比、区别与联系以及应用场景案例分析。
1060 1