文章目录

  • 简介
  • 思维逻辑
  • 配置和测试
    • 数据库创建
    • 配置类注入数据源,配置操作数据库对象
    • 配置config(HttpSecurity)
    • 页面增加记住我选项
    • 测试
  • 注意事项
  • 原理分析
  • 代码下载

简介

在一般的网站中,比如Bilibili。当用户登录成功后,关闭浏览器后,下次重新进入网站,可以自动登录。

本次就来探究如何实现这种自动登录记住我的功能。

思维逻辑

需要实现记住我的功能操作,需要保证具体的实现方式,接下来就来梳理下。

首先,在Security框架中,针对记住我的功能实现,Security框架本身对其做了一定的封装,其实现原理为:

  • 浏览器:cookie中存储加密后的数据串
  • 数据库:MySQL等数据库中存储加密后的数据串用户基本信息数据。

当认证器中,根据客户端传递的cookie值,查询服务器,符合用户基本信息,则自动放行。

配置和测试

数据库创建

本质上是不要创建的,Security框架针对记住我功能的实现,会在数据库不存在表时,org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl自动创建一个persistent_logins表。

如果想手动创建,可以执行下列sql进行表的创建:

CREATE TABLE persistent_logins (
username VARCHAR ( 64 ) NOT NULL,
series VARCHAR ( 64 ) PRIMARY KEY,
token VARCHAR ( 64 ) NOT NULL,
last_used TIMESTAMP NOT NULL
);

配置类注入数据源,配置操作数据库对象

import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;/*** 注入数据源(记住我)*/@Autowiredprivate DataSource dataSource;/*** 配置操作数据库对象* @return*/@Beanpublic PersistentTokenRepository persistentTokenRepository(){JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();jdbcTokenRepository.setDataSource(dataSource);jdbcTokenRepository.setCreateTableOnStartup(true); // 如果没有配置记住我的数据表,则自动生成;如果已存在对应的表,则启动报错return jdbcTokenRepository;}

配置config(HttpSecurity)

.and()
.rememberMe().tokenRepository(persistentTokenRepository()) // 配置记住我的功能,同时增加查询数据库 cookie 值
.tokenValiditySeconds(60)  // 设置cookie的有效时间(秒为单位)
.userDetailsService(mySecurityService) // 查询数据库

页面增加记住我选项

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/user/login" method="post">用户名:<input type="text" name="username" /><br/>密码:<input type="text" name="password" /><br/><input type="checkbox" name="remember-me" title="记住我" />自动登录<br/><input type="submit" value="login" /><br/></form>
</body>
</html>

主要代码为:

<input type="checkbox" name="remember-me" title="记住我" />自动登录<br/>

【注意:】name="remember-me" 这是固定写法,否则无法识别!

测试

重启服务器,请求需要被认证的url:

http://localhost/login.html


关闭浏览器,重新打开,重新请求:
http://localhost/loginSuccess.html

注意事项

由于数据库本身未创建 persistent_logins表,只是在配置类中申明创建表

此时数据库中,可以看到已存在表信息:

此处需要注意的是,如果配置了自动创建表,如果已存在指定的表,启动会报错!

原理分析


1、浏览器请求服务器时,会先经过UsernamePasswordAuthenticationFilter进行认证操作
2、如果UsernamePasswordAuthenticationFilter认证成功,会调用其父类 AbstractAuthenticationProcessingFilter中的doFilter方法。
3、最终执行this.successfulAuthentication(request, response, chain, authResult)

org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices中的loginSuccess方法。


然后在org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#onLoginSuccess中做以下操作:

4、将生成的新的token信息,存储于数据表中,并且也存储在浏览器 cookie 中
5、当浏览器关闭,下次登录时,会根据之前设定的remember-me信息,在org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter中对其验证!

代码下载

springboot-security-09-rememberMe

gitee 代码下载

Spring——Security安全框架之记住我相关推荐

  1. Spring Security 安全框架

    Spring Security 一. Spring Security 简介 1 概括 Spring Security 是一个高度自定义的安全框架.利用 Spring IoC/DI和 AOP 功能,为系 ...

  2. 【安全框架】Spring Security安全框架

    Spring Security 是针对Spring项目的安全框架,仅需要引入 spring-boot-starter-sercurity 模块. WebSecurityConfigurerAdapte ...

  3. springboot集成spring security安全框架入门篇

    一. :spring security的简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下 ...

  4. spring security 安全框架改造统一登录oauth2.0方式

    继上次改造统一登录之后,这次又接到改造任务,这次的项目结构略有不同,不再有web.xml文件,也不是集成的含有拦截器的jar包,而是oauth2.0的授权码(CODE)方式的认证流程, 因为前端还是v ...

  5. Spring Security权限框架简介

    一.框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 是基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案.一般来说,Web  ...

  6. Spring Security安全框架

    安全管理: 认证:确认用户是否登录,对登录进行管控 授权:确定用户的权限,对用户权限进行管理 步骤: 1.添加依赖 启动项目,自定义进行安全管理(默认的安全管理模式) 2.自定义安全管理配置 创建配置 ...

  7. Spring Security 之 Remember-Me (记住我)

    效果:在用户的session(会话)过期或者浏览器关闭后,应用程序仍能记住它.用户可选择是否被记住.(在登录界面选择) "记住"是什么意思? 就是下次你再访问的时候,直接进入系统, ...

  8. Spring——Security安全框架之注解使用

    文章目录 前言 本次测试 注解介绍 注解使用 @Secured @PreAuthorize @PostAuthorize @PostFilter @PreFilter 代码下载 前言 之前securi ...

  9. Spring Security入门到实践(一)HTTP Basic在Spring Security中的应用原理浅析

    一.Spring Security简介 打开Spring Security的官网,从其首页的预览上就可以看见如下文字: Spring Security is a powerful and highly ...

最新文章

  1. 为WPF和Silverlight的Grid添加边框线(zz)
  2. linux之heartbeat高可用的简单配置
  3. javafx2_JavaFX 2 GameTutorial第1部分
  4. mgr未同步 mysql_mysql8.0 搭建mgr踩坑记录
  5. java父类调用子类方法_Java 中父类怎么调用子类的方法?
  6. 做业务千万不要把鸡蛋放在一个篮子里
  7. 计算机出现全部英文如何解决,电脑打开后出现很多英文怎么处理
  8. 前端解析token中的数据_[前端基础]数据类型判定原理解析
  9. 数据bag中的激光雷达数据和相机数据分割出来
  10. java ee课程目标
  11. python3.6 asyncio_python3.6以上 asyncio模块的异步编程模型 async await语法
  12. Servlet(四):转发与重定向、路径问题
  13. android模拟器定位失败,Android-无法在模拟器上获取GPS位置
  14. 一个统计文章字数的算法,求改进
  15. 靖江最正宗过年习俗 只有3%的人完全继承下来了
  16. 最近 火火火火 的 GitHub 项目!
  17. 分布式监控apm_Datadog:APM和分布式跟踪的新Java支持
  18. 我们都需要时间,成为更好的人(转载)
  19. 导出word如何默认打开为页面视图
  20. kalman、particle filter直白理解

热门文章

  1. LGT公益创投(中国)基金项目介绍
  2. 根据经纬度获取具体位置(百度,Java实现)
  3. 计算机安全及故障处理大学论文,网络维护中故障点排除分析及处理措施论文
  4. 解决VirtualBox虚拟电脑控制台严重错误
  5. html5 制作书架展示 PHP,html5制作转盘的详解及实例
  6. [Eclipse手册]设置pom.xml打开方式
  7. Java枚举深入理解以及HttpStatus类的使用
  8. 阿里云服务器搭建java运行环境(jdk+mysql+tomcat)
  9. 软件工程结构化建模的方法和工具_软件工程导论复习题
  10. 关于全连接层 fully connect