SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能

文章目录

  • SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
    • 一、引言
    • 二、JWT简介与组成
      • 1、JWT简介
      • 2、JWT的组成
        • 2.1、Header(头部)
        • 2.2、Payload(载荷)
        • 2.3、Signature(签名)
    • 三、Spring Security整合JWT
      • 1、生成和解析JWT
        • 1.1、生成JWT
        • 1.2、解析JWT
      • 2、配置Spring Security使用JWT
      • 3、登录和登出
        • 3.1、登录
        • 3.2、登出
    • 四、总结

SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能

一、引言

在现代Web应用开发中,安全性是一个不可忽视的重要环节。Spring Security作为Spring家族中的核心安全框架,提供了一套全面的安全解决方案,包括认证(Authentication)和授权(Authorization)。本文将详细介绍如何在SpringBoot项目中整合Spring Security,实现密码的加密解密、登录认证以及退出功能。

二、JWT简介与组成

1、JWT简介

JSON Web Tokens(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。JWT可以在不同的服务和组件之间安全地传输数据,而无需担心数据在传输过程中被篡改。在用户登录后,每个请求都需要包含JWT,这样服务端就可以验证请求的合法性,并获取到请求中携带的信息,如用户身份。

2、JWT的组成

JWT由三部分组成:Header(头部)、Payload(载荷)和Signature(签名)。这三部分共同构成了一个JWT,它们之间用点(.)分隔。

2.1、Header(头部)

Header通常包含两部分:token的类型(即JWT)和所使用的签名算法。例如,如果使用HMAC SHA256算法,则Header看起来可能如下:

{"alg": "HS256","typ": "JWT"
}
  • alg:指定了签名算法,如HS256(HMAC SHA256)。
  • typ:指定了令牌的类型,即JWT。
2.2、Payload(载荷)

Payload部分包含需要传递的信息。它是一个JSON对象,可以包含多个声明(Claims)。声明是关于实体(通常是用户)和其他数据的陈述。声明有三种类型:注册的声明、公共的声明和私有的声明。

  • 注册的声明:一组预定义的声明,它们不是强制的,但是推荐使用,例如iss(发行人)、exp(过期时间)、sub(主题)、aud(受众)等。
  • 公共的声明:可用于公共使用,但不推荐用于限定JWT的某些字段。
  • 私有的声明:用于在发行者和消费者之间传递额外的信息。这些声明是私有的,可以自定义。

例如,Payload可能包含以下内容:

{"sub": "1234567890","name": "John Doe","admin": true
}
  • sub:主题,通常指代JWT所面向的用户。
  • name:用户的名称。
  • admin:一个自定义的声明,表示用户是否是管理员。
2.3、Signature(签名)

Signature用于验证消息的完整性,防止JWT被篡改。Signature是由Header和Payload经过Base64编码后,使用密钥进行加密得到的。Signature的生成公式如下:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
  • base64UrlEncode:对Header和Payload进行Base64编码,但使用URL安全的字符集。
  • secret:服务器端的密钥,用于生成和验证签名,必须保密。

例如,如果Header和Payload如下,且密钥为secret,则Signature的计算过程如下:

String header = "{...}";
String payload = "{...}";
String secret = "secret";String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);

三、Spring Security整合JWT

1、生成和解析JWT

在Spring Security中整合JWT,我们需要创建工具类来生成和解析JWT。

1.1、生成JWT
public class JwtUtil {private static final String JWT_KEY = "secretKey"; // 密钥public static String createJWT(String subject) {return Jwts.builder().setSubject(subject).signWith(SignatureAlgorithm.HS256, JWT_KEY).compact();}
}
1.2、解析JWT
public static Claims parseJWT(String jwt) {return Jwts.parser().setSigningKey(JWT_KEY).parseClaimsJws(jwt).getBody();
}

2、配置Spring Security使用JWT

SecurityConfig中配置Spring Security以使用JWT进行认证。

@Override
protected void configure(HttpSecurity http) throws Exception {http// 其他配置....addFilterBefore(new JwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}

3、登录和登出

3.1、登录

在登录时,生成JWT并返回给客户端。

public String login(String username, String password) {// 验证用户名和密码// 生成JWTString jwt = JwtUtil.createJWT(username);return jwt;
}
3.2、登出

登出时,从Redis中删除对应的JWT信息。

public void logout(String jwt) {// 解析JWT获取用户名String username = JwtUtil.parseJWT(jwt).getSubject();// 从Redis中删除JWT信息redisTemplate.delete("jwt:" + username);
}

四、总结

通过上述步骤,我们成功在SpringBoot项目中整合了Spring Security,并使用JWT实现了用户认证、密码加密解密以及登录认证退出功能。这为构建安全、可靠的Web应用提供了坚实的基础。在实际开发中,我们可以根据项目需求进一步定制和扩展安全策略。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • Spring Security官方文档
  • JWT官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重建大师7.0 | 全新倾斜高斯泼溅OPGS技术,实景三维大规模城市三维场景的更逼真化表达

在刚刚结束的“AI智算、国产信创”2024秋季新品发布会上,大势智慧隆重发布了重建大师7.0、重建农场信创版、低空三维AI智算平台等覆盖实景三维数据生产体系全流程、推进实景三维国产化建设与低空应用的全新系列产品。 今天,重点为大家介绍一下重建大师7.…

华为 Atlas500 Euler 欧拉系统操作指南

华为 Atlas500 Euler 欧拉系统操作指南 ssh root连接 找到Atlas500的IP地址,如:192.168.1.166 账号/密码:admin/Huawei123 root/密码:Huawei123456 #直接使用root ssh连接 这里受限不让直接用root连接 ssh root192.168.1.116 #…

【MySQL 保姆级教学】深层理解索引及特性(重点)--下(12)

索引(重点) 1. 索引的作用2. 索引操作2.1 主键索引2.1.1 主键索引的特点2.1.2 创建主键索引 2.2 唯一键索引2.2.1 唯一键索引的特点2.2.2 唯一索引的创建 2.3 普通索引2.3.1 普通索引的特点2.3.2 普通索引的创建 2.4 全文索引2.4.1 全文索引的作用2.4.2 …

SettlementfactoryController

目录 1、 SettlementfactoryController 1.1、 查询结算明细信息 1.1.1、 //SYS_RecRepairItemDetail修理项目明细表 1.1.2、 //SYS_CollageDetai领料明细表 1.1.3、 //SYS_RecOtherCostDetail其他费用明细表 1.1.4、 //SYS_InsuranceDetail保险理赔明细表 1.1.5、…

ubuntu22.04 docker-compose安装postgresql数据库

在 Ubuntu 22.04 上使用 Docker Compose 来安装和运行 PostgreSQL 数据库的过程如下: 1. 创建 Docker Compose 文件 在项目文件夹中创建一个 docker-compose.yml 文件,以配置 PostgreSQL 数据库的服务。 mkdir postgres_docker cd postgres_docker to…

只允许指定ip远程连接ssh

我们都会使用securtcrt或者xshell等软件进行远程登录,这样虽然会给我们带来很多便捷,但是同样会存在一定的风险。有很多人专门通过重复的扫描试图破解我们的linux服务器,从而获取免费的“肉鸡”。因此我们可以通过设置hosts.allow和hosts.den…

力扣: 144 二叉树 -- 先序遍历

二叉树 – 先序遍历 描述: 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例: 先序遍历:根左右 何解? 1、递归 : 无需多言一看就懂 2、遍历法 中序查找时,最先出入的节点是左子树中的最左侧二叉…

maybe_unused]]编译属性

C(17):[[maybe_unused]]编译属性_maybe unused-CSDN博客 避免编译器发出警告。 [[maybe_unused]] int f() //没有被使用的函数 {return 1; }int main() {[[maybe_unused]] int i 0; //没有被使用的变量return 0; }

【K8S系列】K8S 集群 CPU 爆满导致 Pod Pending 状态的分析与解决方案

在 Kubernetes 集群中,CPU 突然爆满可能导致 Pod 状态变为 Pending,影响应用的可用性。本文将深入分析其原因,并附上相关命令及其执行结果,帮助你更好地理解和解决此问题。 1. 问题描述 在 Kubernetes 集群中,当 CPU …

css中的样式穿透

1. >>> 操作符 <style scoped> /* 影响子组件的样式 */ .parent >>> .child {color: red; } </style>注意&#xff1a;>>> 操作符在某些预处理器&#xff08;如Sass&#xff09;中可能无法识别&#xff0c;因为它不是标准的CSS语法。 …

Linux awk命令详解-参数-选项-内置变量-内置函数-脚本(多图、多示例)

文章目录 awk基础结构说明与示例参数与内置变量常用参数内置变量其他参数内置变量 简单示例理解option简单参数NR与FNR-v ARGC ARGV参数 执行脚本if elsefor循环关联数组指定匹配pattern 使用正则指定分隔符理解pattern正则与逻辑算术 printfif else for whileBEGIN ENDnext(跳…

【Android】组件化开发入门

文章目录 引入组件是什么?为什么使用组件化开发?什么是模块化&#xff0c;组件化&#xff0c;插件化&#xff1f;常见实现 组件分层创建module 组件单独调试配置组件工程类型配置组件ApplicationId和AndroidManifest文件 引入 组件是什么? 组件&#xff08;Component&#…

计算用户订购率梧桐数据库和oracle数据库sql分析

一、背景说明 移动运营商平台提供多种类型的产品权益&#xff0c;用户可以通过订购来使用。平台需要定期统计各个产品的用户订购情况&#xff0c;以便了解各个产品的受欢迎程度。这些统计数据将用于优化产品、提升用户体验和制定市场推广策略。 二、表结构说明 梧桐数据库建…

MySQL数据库基础(一) MySQL安装及数据类型

目录 一、MySQL数据裤简介 二、MySQL数据的安装 2.1、MySQL安装 2.2、修改MySQL密码登录策略 三、数据库基础管理 3.1、连接方式及数据储存流程 3.2、库管理命令 3.3、表管理命令 3.4、记录管理命令 四、MySQL数据类型 4.1、常见信息种类 4.2、字符型 4.3、数值型 4.4、日期时间…

防抖函数--应用场景及示例

防抖函数–应用场景及示例 1.当短时间内出现多次调用同一个东西的时候-可以使用 场景1 接口多次相应401–但是只需要提醒一次 //time 为全局变量 let time;axios.interceptors.response.use(function (response) {if (response.data.code 401) {//当401时清除缓存信息// Mes…

云原生+AI核心技术&最佳实践

以下内容是我在陕西理工大学2023级人工智能专业和网络专业的演讲内容&#xff0c;分享给大家。 各位老师、同学们&#xff0c;大家好啊&#xff01;能在这里跟大家一起聊聊咱们计算机专业那些事儿&#xff0c;我真的觉得超级兴奋&#xff01; 首先&#xff0c;自我介绍一下&am…

Qt QCustomplot 在采集信号领域的应用

文章目录 一、常用的几种开源库:1、QCustomPlot:2、QChart:3、Qwt:QCustomplot 在采集信号领域的应用1、应用实例时域分析频谱分析2.数据筛选和处理其他参考自然界中的物理过程、传感器和传感器网络、电路和电子设备、通信系统等都是模拟信号的来源。通过可视化模拟信号,可以…

AI 大模型重塑软件开发:从代码自动生成到智能测试

引言 随着人工智能技术的飞速发展&#xff0c;特别是大规模预训练模型&#xff08;大模型&#xff09;的出现&#xff0c;AI 正在深刻地改变软件开发的各个环节。从代码自动生成到智能测试&#xff0c;AI 不仅提高了开发效率&#xff0c;减少了错误&#xff0c;还带来了全新的…

C++11的简介

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 一列表初始化的变化&#xff1a; 二左右值即各自引用的概念&#xff1a; 2.1左右…

窗口函数的详解

目录 一、窗口函数的组成部 二、窗口函数的类型 三、窗口函数的排序和分区 四、窗口函数的窗口框架 示例 一、窗口函数的组成部分 窗口函数本身&#xff1a;这是执行计算的函数&#xff0c;如 SUM(), AVG(), ROW_NUMBER() 等。 OVER子句&#xff1a;定义了窗口函数的计算范围。…