SpringBoot使用JWT进行身份验证

news2024/11/26 11:33:03

JWT身份验证的流程

  1. 用户登录: 用户向服务器提供他们的用户名和密码。

  2. 服务器验证:服务器接收到请求,验证用户名和密码。

  3. 生成JWT:如果用户名和密码验证通过,服务器将创建一个 JWT。 JWT 包含了一些数据(称为声明),例如用户 ID、用户名、令牌过期时间等。然后,服务器将对 JWT 进行签名,并将其发送回用户。

  4. 用户存储JWT:用户接收到 JWT,并将其存储在某个位置,例如Web浏览器的localStorage中。

  5. 发送带有JWT的请求:之后,每当用户向服务器发送请求(例如获取数据)时,他们都将在请求头的 Authorization 字段中包含 JWT。

  6. 服务器验证JWT:服务器接收到用户的请求,并从 Authorization 头中提取 JWT。然后,服务器验证该 JWT:它会检查 JWT 是否已经过期,验证签名是否有效,还可能验证一些其他的声明。如果 JWT 有效,服务器就知道这个请求是合法的,并继续处理请求。

  7. 返回响应:一旦服务器处理完用户的请求,它就会将响应发送回用户。

  8. 刷新JWT:如果 JWT 过期了,服务器可能会返回一个新的 JWT 给用户,或者让用户重新登陆,以便他们可以继续发送合法的请求。

JWT的安全性

如果你改变了 JWT 中的任何部分(包括头部、负载或签名),然后尝试验证它,你可能会遇到几个问题:

  1. 签名错误:JWT 的签名是根据头部和负载计算得出的。如果你修改了头部或负载的任何部分,那么签名就不再有效,JWT 的验证将会失败。这是因为签名是为了确保 JWT 的头部和负载没有被篡改。

  2. 格式错误:如果你修改了 JWT 的格式(例如,删除了某个部分,或者改变了部分之间的点号分隔符),那么 JWT 可能无法被正确解析,这将导致错误。

  3. 负载数据错误:如果你修改了负载中的数据(这是 JWT 中包含的实际信息,如用户 ID、过期时间等),那么这些数据可能无法被正确解析,或者可能导致验证错误(例如,如果你把过期时间改为了过去的时间,那么 JWT 将被视为已经过期)。

SpringBoot中使用JWT

 添加maven依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
package xin.students.springbootpro;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.UUID;

@SpringBootTest
class SpringBootProApplicationTests {

    // 设置 token 过期时间为24小时
    private long time = 1000 * 60 * 60 * 24;

    // 使用 HS256 算法生成一个安全的密钥
    private SecretKey signature = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    @Test
    public void createToken() {
        // 构建一个 JWT Builder
        JwtBuilder jwtBuilder = Jwts.builder();

        // 生成 JWT Token
        String jwtToken = jwtBuilder
                .setHeaderParam("typ", "JWT") // 设置 JWT 类型
                .setHeaderParam("alg", "HS256") // 设置签名算法
                .claim("username", "tom") // 添加 username 到载荷中(自定义的key:value)
                .claim("role", "admin") // 添加 role 到载荷中(自定义的key:value)
                .setSubject("admin-test") // 设置主题
                .setExpiration(new Date(System.currentTimeMillis() + time)) // 设置过期时间
                .setId(UUID.randomUUID().toString()) // 设置 JWT ID,通常是随机生成的
                .signWith(signature) // 签名 JWT,用以验证其完整性
                .compact(); // 压缩 JWT 到一个 compact, URL-safe string
        System.out.println(jwtToken);

        System.out.println("下面是解密后的原文------------------------------------");

        // 解析生成的 token
        parseToken(jwtToken);
    }

    public void parseToken(String token) {
        // 创建一个 JWT 解析器
        JwtParser jwtParser = Jwts.parserBuilder()
                .setSigningKey(signature)
                .build();
        // 解析 token
        Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);
        // 获取载荷
        Claims claims = claimsJws.getBody();
        // 打印载荷中的各种信息
        System.out.println(claims.get("username")); // 打印 username对应的值
        System.out.println(claims.get("role")); // 打印 role对应的值
        System.out.println(claims.getId()); // 打印 JWT ID
        System.out.println(claims.getSubject()); // 打印主题
        System.out.println(claims.getExpiration()); // 打印过期时间
    }
}

 

 

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

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

相关文章

JS混淆原理2023

JS混淆原理 •eval 加密 通过eval去执行函数通常和webpack打包拼接一起使用• 变量混淆 ​ 变量名混淆&#xff0c;十六进制替换&#xff0c;随机字符串替换• 属性加密 ​ 一套组合算法&#xff0c;将属性加密生成• 控制流平坦化 逻辑处理块统一加上前驱逻辑块&#xff0c…

kubeproxy和service dns整体原理

iptables知识 五条链 iptables是linux内核集成的IP信息过滤规则&#xff0c;负责将发往主机的网络包进行分发&#xff0c;转换等。当客户端请求服务器的某个服务时&#xff0c;请求信息会先通过网卡进入服务器内核&#xff0c;这时iptables会对包进行过滤&#xff0c;决定这些…

Docker安装卸载

说明&#xff1a;在大型的项目开发中&#xff0c;各种开发软件所需的环境各不相同&#xff0c;所需的依赖也时常发生冲突。而Docker将开发软件&#xff0c;和所需的依赖、函数库、配置打包成一个可移植的镜像文件&#xff0c;在Docker的容器中运行&#xff0c;使用沙箱机制&…

线程基础和等待唤醒机制

一、基础 1、进程和线程 进程&#xff1a;进程是用来加载指令、管理内存、管理IO的&#xff0c;操作系统会以进程为单位分配系统资源&#xff08;cpu、内存等资源&#xff09;&#xff0c;进程是资源分配的最小单位线程&#xff1a;线程是操作系统cpu调度的最小单位&#xff…

用Linux模拟实现进度条

1.设置文件&#xff0c;以及创建makefile 2.make 的相关用法 make存在的目的就是为了在文件多的时候&#xff0c;gcc 文件名&#xff0c;你可能要输入很多次&#xff0c;但是make的存在&#xff0c;一句make指令就可以完成了。 process [生成文件] : 与之有关的文件。下一行就…

Sparse Input Novel View Synthesis

文章目录 1.《Vision transformer for nerf-based view synthesis from a single input image》【WACV2023】摘要动机方法实验 2.《SparseFusion: Distilling View-conditioned Diffusion for 3D Reconstruction》【CVPR23】动机Related workApproach总结 3.《NerfDiff: Single…

NetSuite ERP顾问的进阶之路

目录 1.修养篇 1.1“道”是什么&#xff1f;“器”是什么&#xff1f; 1.2 读书这件事儿 1.3 十年计划的力量 1.3.1 一日三省 1.3.2 顾问损益表 1.3.3 阶段课题 2.行为篇 2.1协作 2.2交流 2.3文档管理 2.4时间管理 3.成长篇 3.1概念能力 3.1.1顾问的知识结构 …

TCP缓冲区和4次挥手调优

目录 如何修改TCP缓冲区才能兼顾并发数量与传输速度&#xff1f; 四次挥手性能调优 1,为什么建立连接是三次握手&#xff0c;而关闭连接需要四次挥手呢? 2.四次挥手的流程,注意5个状态 3.主动方优化 4,被动方调优 最后 如何修改TCP缓冲区才能兼顾并发数量与传输速度&…

NUC972开发板学习过程

1、搭建linux环境的过程&#xff0c;设置交叉编译器的环境变量过程中会出现各种问题&#xff1b; 解决方法&#xff1a; 第一步、一定要Ubuntu系统换源&#xff0c;换源后sudo apt-get update&#xff1b; 第二步、sudo apt-get install lib32stdc6 第三步、使用 vim编辑器…

创新指南|连锁经营,先从单店盈利模型做起

随着数字化时代的到来&#xff0c;数据成为了企业创新的重要资源。有价值的数据的涌现和发展为企业提供了前所未有的机会。数据为创新带来新动力&#xff0c;创造了新产品和服务、产生了新的商业模式&#xff0c;并带来了新的创业机会。数据驱动的创新已成为许多企业创新的重要…

4.1.tensorRT基础(1)-概述

目录 前言1. tensorRT基础概述2. tensorRT补充知识2.1 什么是tensorRT&#xff1f;2.2 tensorRT特性2.3 tensorRT工作流程2.4 常见方案2.5 tensorRT库文件 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#…

springboot+ElasticSearch+Logstash+Kibana实现日志采集ELK

ElasticSearchLogstashKibana日志管理 一、什么是ELK? ELK是Elasticsearch、Logstash、Kibana的简称&#xff0c;这三者是核心套件&#xff0c;但并非全部。一般情况下我们可以把日志保存在日志文件当中&#xff0c;也可以把日志存入数据库当中。但随着业务量的增加&#xf…

2.多线程-初阶(上)

文章目录 1. 认识线程&#xff08;Thread&#xff09;1.1 概念1.2 第一个多线程程序1.3 创建线程1.3.1方法1 继承 Thread 类1.3.2方法2 实现 Runnable 接口 1.4 多线程的优势-增加运行速度1.5 PCB、PID、进程和线程之间的关系 2. Thread(/θred/) 类及常见方法2.1 Thread 的常见…

《Maven实战》读后感

目录 一、一些思考1、为什么平时编写的Java项目也叫做Maven项目&#xff1f;2、平常的Java项目目录为什么长这样&#xff0c;可以改变目录结构吗&#xff1f;3、对于Maven项目来说&#xff0c;Maven能帮我们做什么&#xff1f;4、为什么一定需要Maven私服&#xff0c;不要行不行…

easyrecovery数据恢复软件2023免费版下载

easyrecovery数据恢复软件2023免费版下载是一款操作简单、功能强大数据恢复软件,通过easyrecovery可以从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或丢失的文件、图片、音频、视频等数据文件。 EasyRecovery数据恢复软件是一款功能强大的数据恢复软件&#xff0c…

卡尔曼滤波的理解

看了B站up主DR_CAN讲的卡尔曼滤波&#xff08;链接&#xff09;。up讲的非常好&#xff0c;强烈推荐&#xff0c;看完终于明白了卡尔曼滤波的奥秘。下面是我对其中内容的注解&#xff0c;或者说自己的理解。大部分推导省略了&#xff0c;但保留了算法的思想脉络。 引入 首先看…

Verilog基础之十七、锁相环PLL

目录 一、前言 1.1 背景 1.2 PLL结构 二、工程设计 2.1 PLL IP核配置 2.2 设计代码 2.3 测试代码 2.4 仿真结果 2.5 常见问题 一、前言 1.1 背景 若将一个FPGA工程看做一个人体&#xff0c;时钟的重要性丝毫不亚于心脏对于人体的重要性&#xff0c;时钟的每一个周期对…

支付、购物车、搜索、文件上传、登录、还款、订单测试怎么做?

支付功能怎么测试&#xff1a;1、从功能方面考虑&#xff1a; 1&#xff09;、正常完成支付的流程&#xff1b; 2&#xff09;、支付中断后继续支付的流程&#xff1b; 3&#xff09;、支付中断后结束支付的流程&#xff1b; 4&#xff09;、单订单支付的流程&#xff1b; 5&am…

【无标题】(前沿)

Java编程语言 目前为止最流行的 是Java编程语言 但是编程与语言有很多中php。phyone。 c c. c# java html. css javascript vue() 说到计算机有很多同学会说&#xff0c;就有很多人会说35的节点&#xff0c;我问一下同学们现在哪一个行业&#xff0c;是没有35岁的节点&#x…

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截&#xff1f;2. 如何拦截角色注解&#xff1f;3. 角色如何读取?4. 最后做角色校验 三、应用&#xff1a;给管理员操作接口加注解四、PostMan测试最后 前言 在【7.1】管理员图书录入和修改API&#xf…