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

news/2024/11/8 23:35:48 标签: spring boot, 后端, java

文章目录

  • 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) {
    // 验证用户名和密码
    // 生成JWT
    String 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.niftyadmin.cn/n/5744557.html

相关文章

Java LeetCode练习

3194. 最小元素和最大元素的最小平均值 package JavaExercise;import java.util.Arrays;public class Exercise {public static void main(String[] args) {int[] array {1,2,3,7,8,9};System.out.println(Solution.minimumAverage(array));} }class Solution {public static…

70B的模型做微调,使用A10*8的卡能够使用

使用 8 张 A10 GPU(每张 A10 GPU 大约有 24 GB 的显存)来微调 70B 参数的模型会比较困难,主要原因是显存不足。像 70B 参数量级的模型(如 LLaMA-2 70B、BLOOM-176B)通常需要几百 GB 以上的显存,仅加载模型就…

计算机专业开题报告写法,该怎么写好?

不会写开题报告,或者想要一些论文模版的,欢迎评论,会第一时间给大家。 题报告是计算机专业大学毕业生在开展毕业设计或论文研究前,对研究课题进行详细介绍和计划的重要环节。作为开题者对科研课题的一种文字说明,开题…

第八篇: 通过使用Google BigQuery进行数据批量和自动化处理

使用Python进行Google BigQuery数据批量和自动化处理 在大数据分析的日常工作中,定期更新、查询和处理数据是一项必不可少的任务。Google BigQuery结合Python脚本,可大幅简化这一过程。本文将介绍如何通过Python自动查询和更新BigQuery中的降水量数据&a…

2024/11/08学习日志

为了更好地记录并反思自己的学习状况,将每日学习的内容、时长、心得等记录于此日志。 于9月3日开始记录,计划每日记录,希望至少能够坚持一个学期。 学习内容: 计组: disk的读取 cache 离散: 复习离散…

Systemd:tmpfiles

Systemd提供了一个结构化的可配置方法来管理临时文件和目录,即systemd-tmpfiles,可以创建、删除和管理临时文件的服务。 $ systemctl list-units --all | grep systemd-tmpfilessystemd-tmpfiles-clean.service load…

ElasticSearch从环境搭建到如何使用的全过程

ES是什么? ES是一款非常强大的开源的高扩展的分布式全文检索引擎,可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的存储、检索数据。还可以实现日志统计、分析、系统监控等功能。 例如京东、淘宝、头条等站内搜索功能 在大数据环境下,Elasticsearc…

SpringBoot开发——Spring Boot 3种定时任务方式

文章目录 一、什么是定时任务二、代码示例1、 @Scheduled 定时任务2、多线程定时任务3、基于接口(SchedulingConfigurer)实现动态更改定时任务3.1 数据库中存储cron信息3.2 pom.xml文件中增加mysql依赖3.3 application.yaml文件中增加mysql数据库配置:3.4 创建定时器3.5 启动…