当前位置: 首页 > article >正文

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) {
    // 验证用户名和密码
    // 生成JWT
    String 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.kler.cn/a/385295.html

相关文章:

  • 【网络】网络层协议IP
  • [linux]docker基础
  • Scaffold-ETH 2:颠覆传统开发的区块链神器,快速构建你的去中心化应用!
  • Spring Security @PreAuthorize @PostAuthorize 权限控制
  • 人保财险(外包)面试分享
  • 在OceanBase 中,实现自增列的4种方法
  • Navicat15,Navicat16闪退,创建连接,使用自带工具等闪退
  • 二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
  • 【ChatGPT】让ChatGPT帮助制定项目计划与任务分配
  • App投放增长:RTA
  • 【笔记】扩散模型(九):Imagen 理论与实现
  • 什么是ReasonML,有什么特点
  • 利用SheetJS在前端解析Excel读取数据并赋值给组件
  • Sentinel通过限流对微服务进行保护
  • 免费caj转pdf
  • 上门理发系统的搭建
  • Flutter鸿蒙next 状态管理框架对比分析
  • I.MX6U 裸机开发3. GPIO操作控制LED灯
  • leetcode哈希表(四)-快乐数
  • glide 加载gif 卡顿内存高问题 优化
  • [java][框架]springMVC(1/2)
  • go 集成Gin Web开发框架
  • Flutter鸿蒙next中的表单封装:提升开发效率与用户体验
  • HCIP-HarmonyOS Application Developer V1.0 笔记(四)
  • vue3 + ts + vite 初始化 Mars3D
  • sudo docker ps才能查看,docker ps不能查看问题