【Spring Boot 快速入门】十九、Spring Boot 集成JWT

简介: 【Spring Boot 快速入门】十九、Spring Boot 集成JWT

前言


  相信很多后端的小伙伴,在做权限认证的时候,首先想到的是基于session或者token的认证。当我们在做分布式站点集群的用户单点登录的时候,基于session和token的认证就有局限性了,那么有没有更好的方式去处理认证问题呢,下面与大家介绍一下JWT。


什么是JWT


  JWT是JSON WEB TOKEN的简称,JWT是一个开放标准(RFC 7519)经常用于在多方之间安全的传输信息。JWT由于有较高的信息安全性,被广泛的应用于授权和信息交互方面。在被JWT加密的信息是一种紧密的自包含的数据串。


JWT格式


  JWT格式是由三段信息构成的,它们之间用圆点(.)连接,第一部分是头部信息,第二部分是载荷信息,第三部分是签证信息。如下字符串是一个JWT格式的字符串。


  • eyJhbGciOiJIUzI1NiJ9:是头部信息,头部信息主要是token的类型和算法等信息。
  • eyJqdGkiOiIxIiwic3ViIjoiYWRtaW4xMjM0NTYiLCJpc3MiOiJ1c2VyIiwiaWF0IjoxNjM3MjM2NDI5LCJleHAiOjE2MzcyMzY0Mzl9:载体信息,主要是加密的数据资源信息。
  • t5pAMGV0Rx3C455f5c812yvqnC6UqwiTpALeo5EFvR8:签证信息。签证信息主要用于验证消息在传递过程中有没有被篡改。

  需要注意的是,在头部信息和载体信息z中放置敏感的信息,需要先加密处理。


eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoiYWRtaW4xMjM0NTYiLCJpc3MiOiJ1c2VyIiwiaWF0IjoxNjM3MjM2NDI5LCJleHAiOjE2MzcyMzY0Mzl9.t5pAMGV0Rx3C455f5c812yvqnC6UqwiTpALeo5EFvR8


快速开始


  本次将基于Spring Boot 搭建一个学习Mybatis_Plus的乐观锁的Demo。开发环境如下:


JDK1.8
SpringBoot 2.3.0.RELEASE
java-jwt 3.2.0
jjwt 0.7.0


依赖


  本次需要加入JWT相关的依赖包,具体依赖如下,如有不同版本,可能存在于SpringBoot兼容性问题,找到实配版本即可。


<dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>
复制代码


创建JWT


SignatureAlgorithm中定义的标准JWT签名算法支持的算法名称,可以直接引用即可。具体定义的算法名称如下图:

image.png

本次采用的签名算法是:SHA-256。 首先指定本次JWT使用的签名算法。具体信息如下:

SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;


再次设置秘钥信息SecretKey。采用Base64对秘钥转换成字节数组。创建一个

SecretKeySpec密钥规范。采用AES加密。


byte[] encodedKey = Base64.decode(JWT_SECERT);
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");


下面根据JwtBuilder创建Jwt对象,JwtBuilder继承了ClaimsMutator。调用Jwts.builder(),设置builder的基本参数创建JwtBuilder。


JwtBuilder builder = Jwts.builder().setId(id).setSubject(subject)
                .setIssuer("juejin")
                .setIssuedAt(now)
                .setExpiration(expDate)
                .signWith(signatureAlgorithm, secretKey);
builder.compact()


主要包含:ID ,subject加密内容、Issuer签发者信息、IssuedAt签发时间、Expiration过期时间、signatureAlgorithm签名使用的算法和secretKey秘钥信息。 然后调用builder.compact()方法即可创建JWT字符串。例如使用字符串:“掘金——代码不止,掘金不停”生成一串JWT信息如下:


eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoi5o6Y6YeR4oCU4oCU5Luj56CB5LiN5q2i77yM5o6Y6YeR5LiN5YGcIiwiaXNzIjoidXNlciIsImlhdCI6MTYzNzI0MjY0NywiZXhwIjoxNjM3MjQyNjU3fQ.mMkMRyxVTcOSZCDrR5cGvY6KcRPCVVQwETSyPQMSAQo


验证JWT


  上面已经创建了JWT信息,当我们获取到JWT信息怎么验证和读取JWT中包含的信息呢,下面就开始介绍验证JWT。其中secretKey是上面介绍到的秘钥信息,获取方法与上面类似,参数jwt是创建的JWT信息。然后通过getBody()获得Claims、


Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();


JWT Claims主要包含:用户身份标识ID,iss签发人信息,sub内容信息,iat签发时间,exp过期时间等。以上是JWT创建过程的建立和验证,下面在Spring Boot项目中进行验证使用。


测试JWT


在Spring Boot项目中进行验证使用。本次验证使用两个接口调用验证,一个是获取JWT接口,一个是验证JWT接口,将获取到的JWT信息传输到验证接口,看是否能获取到JWT中的信息。接口如下:


@GetMapping("setJwt")
@ResponseBody
public String setJwt(String info){
    return JwtUtils.createJWT("juejin",info,10000L);
}
@GetMapping("getJwt")
@ResponseBody
public String getJwt(String info)throws Exception{
    return JwtUtils.validateJWT(info).getClaims().getSubject();
}


启动项目之后,先调用获取JWT的接口,可以看到已经获取到了JWT。


image.png


eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqdWVqaW4iLCJzdWIiOiLmjpjph5HigJTigJTku6PnoIHkuI3mraLvvIzmjpjph5HkuI3lgZwiLCJpc3MiOiJ1c2VyIiwiaWF0IjoxNjM3MjQ1MTQwLCJleHAiOjE2MzcyNDUxNTB9.WKso2dPHEtSx_ItCCXmq2QjSDR6AIBzetKft4CJ8wNQ


然后经获取到的JWT调用验证JWT的接口,返回“掘金——代码不止,掘金不停”,验证成功。


image.png


结语


  好了,以上就是Spring Boot 集成JWT的一个简单示例


目录
相关文章
|
2月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
436 2
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2762 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
534 0
|
3月前
|
数据可视化 Java BI
将 Spring 微服务与 BI 工具集成:最佳实践
本文探讨了 Spring 微服务与商业智能(BI)工具集成的潜力与实践。随着微服务架构和数据分析需求的增长,Spring Boot 和 Spring Cloud 提供了构建可扩展、弹性服务的框架,而 BI 工具则增强了数据可视化与实时分析能力。文章介绍了 Spring 微服务的核心概念、BI 工具在企业中的作用,并深入分析了两者集成带来的优势,如实时数据处理、个性化报告、数据聚合与安全保障。同时,文中还总结了集成过程中的最佳实践,包括事件驱动架构、集中配置管理、数据安全控制、模块化设计与持续优化策略,旨在帮助企业构建高效、智能的数据驱动系统。
221 1
将 Spring 微服务与 BI 工具集成:最佳实践
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1361 0
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
403 0
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
1171 6

热门文章

最新文章