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

embedded/2024/11/9 2:40:01/

文章目录

  • 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的计算过程如下:

java">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
java">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
java">public static Claims parseJWT(String jwt) {return Jwts.parser().setSigningKey(JWT_KEY).parseClaimsJws(jwt).getBody();
}

2、配置Spring Security使用JWT

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

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

3、登录和登出

3.1、登录

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

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

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

java">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.ppmy.cn/embedded/136055.html

相关文章

数据结构---链表实现双端队列

package cn.dragon.arithmetic.model;import java.util.LinkedList;//链表实现双端队列 public class MyListDeque<T> {private LinkedList<T> list new LinkedList<>();void addFirst(T d) {list.addFirst(d);}void addLast(T d) {list.addLast(d);}T remo…

java:修复aspectj-maven-plugin插件在java9项目中执行报错:cannot be resolved to a module

javadocreader9(https://gitee.com/l0km/javadocreader9)是我最近写的一个基于Java 9 的javadoc读取java代码注释的工具。在基于Java 9(我用的编译器JDK 19)编译时&#xff0c;aspectj-maven-plugin插件在执行报了一堆错误&#xff1a; xxx cannot be resolved to a module,如下…

TypeScript 支持的常见运算符

下面是对 TypeScript 支持的常见运算符的汇总&#xff0c;包括 算术运算符、赋值运算符、比较运算符 等内容&#xff0c;另外补充了 ! 和 !! 运算符的用法。 1. 算术运算符 加法运算符- 减法运算符* 乘法运算符/ 除法运算符% 取余运算符 自增运算符-- 自减运算符 let a 10, b…

从零开始搭建Halo个人博客

前言 老话说得好&#xff0c;好记性不如烂笔头。对于程序员来说&#xff0c;学无止境&#xff0c;需要学习的东西很多&#xff0c;而如果不记录下来可能过不了多久就忘记了&#xff0c;而记录下来这一步也能很好地贯彻费曼学习法。 其实网上有很多博客平台&#xff0c;但是自…

梧桐数据库SQL分析对比之订单最多的客户

一、背景说明 在特定的业务场景&#xff0c;许多业务部门需要推送业务订单最多的客户。需要编写一个解决方案&#xff0c;找出业务订单最多的客户。 本次以三种不同数据库进行分析和用例讲解&#xff0c;分别是梧桐数据库&#xff0c;mysql &#xff0c;oracle 。 二、表结构…

HFSS 3D Layout中Design setting各个选项的解释

从HFSS 3D LAYOUT菜单中&#xff0c;选择Design Settings打开窗口&#xff0c;会有六个选项&#xff1a;DC Extrapolation, Nexxim Options, Export S Parameters, Lossy Dielectrics, HFSS Meshing Method, and HFSS Adaptive Mesh. DC Extrapolation 直流外推 直流外推分为标…

计算机网络——IP协议

ICMP Traceroute upper layer表示上层用户标识——TCP还是UDP IP数据报格式的校验和主要检测头部是否出错 Options会将源主机到目标主机所经过的路由器和交换机进行记录 IP地址 同一个子网下&#xff0c;前缀相同 子网间的收发一跳可达&#xff0c;不用借助路由器&#xff0c;可…

7.0、RIP

RIP (Routing Information Protocol) 简介 RIP是由Xerox在20世纪70年代开发的&#xff0c;最初定义在RFC1058中。RIP用两种数据包传输更新:更新和请求&#xff0c;每个有RIP功能的路由器在默认情况下&#xff0c;每隔30s利用UDP520端口向与它直连的网络邻居广播(RIP1)或组播(R…