Spring Boot 集成JWT实现Token验证详解

文章目录

Spring Boot 集成JWT实现Token验证详解

一、引言

在现代Web应用开发中,随着前后端分离和微服务架构的流行,传统的基于Cookie和Session的身份验证方式已经逐渐被基于Token的验证方式所取代。JWT(Json Web Tokens)作为一种轻量级的身份验证机制,因其简单、安全且易于使用的特性而广受欢迎。本文将详细介绍什么是JWT,什么是Token,以及如何在Spring Boot项目中集成JWT来实现Token验证。

二、JWT和Token基础

1、什么是Token

Token是一种令牌,它在用户登录后由服务器生成并返回给客户端,客户端在随后的请求中将Token附在HTTP请求头中,以此来验证用户的身份。Token通常包含了用户的身份信息和一些其他的元数据。

2、什么是JWT

JWT(Json Web Tokens)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在双方之间以JSON对象的形式安全地传输信息。每个Token都是经过数字签名的,因此可以被验证和信任。JWT可以使用秘密(对称加密)或使用RSA或ECDSA的公钥/私钥对(非对称加密)进行签名。

3、JWT的结构

JWT由三部分组成,用点.分隔:

  • Header(头部):通常包含Token的类型(即JWT)和所使用的签名算法,如HMAC SHA256或RSA。
  • Payload(负载):包含所要传递的信息。负载可以包含多个声明(Claims),声明是关于实体(通常是用户)和其他数据的声明。
  • Signature(签名):用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的Token,还可以验证发送者的身份。

4、JWT的工作原理

  1. 用户使用用户名和密码登录。
  2. 服务器验证用户的凭据,并创建一个包含用户信息和其他需要的数据的JWT。
  3. 服务器将JWT发送给客户端。
  4. 客户端在随后的每个请求中将JWT放在HTTP请求头中发送给服务器。
  5. 服务器验证JWT的有效性,如果有效,则允许用户访问资源。

三、集成JWT

1、引入JWT依赖

在Spring Boot项目的pom.xml文件中引入JWT依赖。

xml 复制代码
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、创建Token工具类

创建一个工具类TokenUtil,用于生成和验证JWT Token。

java 复制代码
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class TokenUtil {
    private static final String SECRET = "your-secret"; // 密钥,生产环境应保持安全

    public String createToken(String username) {
        try {
            Date expireDate = new Date(System.currentTimeMillis() + 3600 * 1000); // 设置Token过期时间
            return JWT.create()
                    .withIssuer("auth0")
                    .withClaim("username", username)
                    .withExpiresAt(expireDate)
                    .sign(Algorithm.HMAC256(SECRET));
        } catch (Exception exception) {
            throw new RuntimeException("Token创建失败");
        }
    }

    public Map<String, String> verifyToken(String token) {
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET))
                    .withIssuer("auth0")
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            return jwt.getClaims();
        } catch (JWTVerificationException exception) {
            throw new RuntimeException("Token验证失败");
        }
    }
}

3、创建拦截器

创建一个拦截器TokenInterceptor,用于在请求中验证Token。

java 复制代码
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class TokenInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if (token != null && !token.isEmpty()) {
            TokenUtil tokenUtil = new TokenUtil();
            Map<String, String> claims = tokenUtil.verifyToken(token);
            if (claims != null) {
                return true;
            }
        }
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        response.getWriter().write("Unauthorized");
        return false;
    }
}

4、注册拦截器

将拦截器注册到Spring Boot中。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private TokenInterceptor tokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/login", "/public/**");
    }
}

四、总结

通过上述步骤,我们已经在Spring Boot项目中成功集成了JWT,实现了Token的生成和验证。这种基于Token的身份验证机制不仅适用于单体应用,也适用于微服务架构,为现代Web应用提供了一种灵活、安全的身份验证解决方案。希望本文能帮助你更好地理解和实现JWT Token验证。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

相关推荐
秋野酱1 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇2 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
架构文摘JGWZ2 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC2 小时前
Swift语言的网络编程
开发语言·后端·golang
邓熙榆2 小时前
Haskell语言的正则表达式
开发语言·后端·golang
多则惑少则明4 小时前
SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别
spring boot·spring·ssh
Swift社区4 小时前
【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径
人工智能·spring boot·分布式
专职5 小时前
spring boot中实现手动分页
java·spring boot·后端
Ciderw5 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·
m0_748246356 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端