Spring Security安全框架之记住我功能
作者:专注写bug 发布时间:2023-08-19 02:38:43
简介
在一般的网站中,比如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;
/**
* 注入数据源(记住我)
*/
@Autowired
private DataSource dataSource;
/**
* 配置操作数据库对象
* @return
@Bean
public 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 代码下载
来源:https://blog.csdn.net/qq_38322527/article/details/123109261


猜你喜欢
- 前言:在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件
- 本次为了记录开发一个基于webservice接口,去解析对方传送过来的xml字符串。实际使用时遇到的一些问题。传输过来的xml格式大致如下:
- import java.io.BufferedInputStream;import java.io.BufferedOutputStream
- 大二的时候做的课程设计,图片管理器,当时遇到图片很多的文件夹,加载顺序非常慢。虽然尝试用多个Thread加载图片,却无法保证图片按顺序加载。
- Android Studio是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA。它类似于Eclipse ADT,And
- Android利用爬虫实现模拟登录的实现实例为了用手机登录校网时不用一遍一遍的输入账号密码,于是决定用爬虫抓取学校登录界面,然后模拟填写本次
- 今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常。服务器端确认是编码转换错误。于是截取网络数据包进行分析,发
- 一、简述记--log4net日志开源库的简单使用:控制日志文件大小,日志文件个数,滚动式覆盖,自由控制日志打印等级例子打包:http://x
- 本文实例为大家分享了android canvas使用line画半圆具体代码,供大家参考,具体内容如下LineView.javapublic
- 多网卡环境下Eureka服务注册IP选择问题场景服务器上分别配置了eth0和eth1两块网卡,只有eth1的地址可供其它机器访问,在这种情况
- 一、File类的概述和构造方法public class Fileextends Objectimplements Serializable,
- 一、新建BeanUtil类import lombok.extern.slf4j.Slf4j;import org.springframewo
- 本文的目的是用springboot整合mybatis实现一个简单的一对多查询。(查询一个用户有多少件衣服)第一步:数据库中,可以直接在nav
- 简介工厂方法模式是什么?为什么要有工厂方法模式,不是有了简单工厂模式了吗?两个模式都有工厂,那有什么不同呢?功工厂方式模式是怎样实现的?OK
- 1. InputStream -> byte[]引入 apache.commons.is 包import org.apache.com
- 引出泛型我们通过如下的示例,引出为什么泛型的概念。public class Test {public static void main(St
- 1.1、获取http请求参数是一种刚需我想有的小伙伴肯定有过获取http请求的需要,比如想前置获取参数,统计请求数据做服务的接口签名校验敏感
- 1.组件添加1.1@Configuration@Configuration:告诉SpringBoot这是一个配置类配置类里面使用@Bean标
- 具体代码如下所示:package zhangphil.test; import android.graphics.Bitmap; impor
- 一般来讲,项目更换JDK版本的情况比较少,但是有时难免会遇到。电脑安装不同版本的JDK这里不做介绍。这里记录一下修改项目JDK版本要注意的几