Spring Boot整合JWT的实现步骤

下面是详细讲解Spring Boot整合JWT的实现步骤的完整攻略。

概述

JWT(JSON Web Token)是目前比较流行的身份验证和授权机制,它将用户的身份信息封装在 JSON 格式的 Token 中,在多个服务之间传递。Spring Boot是一种基于Spring框架的快速开发工具,支持构建独立的、生产级别的 Spring 应用程序。将Spring Boot和JWT集成,可以快速实现安全、简洁的前后端分离应用。

本篇攻略将详细介绍Spring Boot整合JWT的实现步骤,包括依赖引入、配置文件修改及JWT的生成和验证。

步骤一:添加依赖

在Spring Boot项目中,我们需要添加 JWT 相关的依赖,以方便开发者调用 JWT 基础功能。

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

步骤二:配置文件

在Spring Boot项目中,JWT的一些相关配置可以在application.properties文件中配置。我们需要添加如下配置:

# JWT 配置
jwt.secretKey=MyJwtSecretKey
jwt.issuer=MyJwtIssuer
jwt.audience=MyJwtAudience
jwt.expiration=864000000 # 10天
  • jwt.secretKey:JWT 对称加密的密钥
  • jwt.issuer:JWT 签发者
  • jwt.audience:JWT 接收方
  • jwt.expiration:JWT 过期时间

在 application.properties 中我们也可以通过 ${} 的方式引用环境变量。

步骤三:JWT生成

接下来,我们将在Spring Boot中生成一个 JWT。在生成 JWT 之前,我们需要定义一个方法生成一个JWT Token, 示例如下:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class JwtTokenProvider {
    // 加密密码
    @Value("${jwt.secretKey}")
    private String secretKey;
    // token过期时间
    @Value("${jwt.expiration}")
    private long expiration;
    // 签发者
    @Value("${jwt.issuer}")
    private String issuer;
    // 颁发给
    @Value("${jwt.audience}")
    private String audience;

    public String generateToken(String username) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + expiration);
        return Jwts.builder()
                .setSubject(username)
                .setIssuer(issuer)
                .setAudience(audience)
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS512, secretKey)
                .compact();
    }
}

这里我们使用 io.jsonwebtoken.Jwts 类的 builder() 方法,将需要加密的用户信息和已有配置项参数包含在内,使用 HS512 签名算法加密生成一个JWT Token,最后使用 .compact() 方法生成一个字符串来表示JWT。如果您需要使用 RSA 或其他加密算法,请自行更改代码中的签名算法。

这是一个生成JWT Token的示例,仅适用于Demo项目。

步骤四:JWT验证

JWT 生成之后,需要在项目中添加 JWT 验证配置。我们需要在Spring Security中定义一个类,来处理传入请求时的JWT验证。 示例如下:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Value("${jwt.secretKey}")
    private String secretKey;

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {

        try {
            String jwt = getJwtFromRequest(httpServletRequest);
            if (StringUtils.hasText(jwt) && validateToken(jwt)) {
                //获取JWT的Claims
                Claims claims = Jwts.parser()
                        .setSigningKey(secretKey)
                        .parseClaimsJws(jwt)
                        .getBody();
                String username = claims.getSubject();
                List<String> authorities = Arrays.asList(claims.get("authorities").toString().split(","));
                List<SimpleGrantedAuthority> simpleGrantedAuthorities = authorities.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());
                UserDetails userDetails = new User(username, "", simpleGrantedAuthorities);
                Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        } catch (Exception ex) {
            logger.error("Could not set user authentication in security context", ex);
        }

        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }

    private String getJwtFromRequest(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }

    private Boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
            return true;
        } catch (SignatureException ex) {
            logger.error("Invalid JWT signature");
        } catch (Exception ex) {
            logger.error("Invalid JWT token");
        }
        return false;
    }
}

在这段代码里我们需要继承 Spring Security 中的 OncePerRequestFilter 类,并重写 doFilterInternal 方法,在这个方法中,我们判断传入的请求中是否携带了JWT Token,如果有就将其和加密的Secret Key 对比验证,然后将验证成功的用户ID存储在 Spring Security 的上下文(Context)中。

我们需要通过 JWT Token 的 Claims 方法获取Token中的信息,将其封装在 UserDetails 中,然后再通过 Spring Security 的上下文存储,在后续我们可以使用 UserDetails 获取用户的相关信息。

示例代码

在实现步骤中给出的示例代码,需要注意以下几点:

  1. 此示例代码是基于 Spring Boot 和 Spring Security 来实现的,需要一定的 Spring Boot 开发经验。如果您对 Spring Boot 和 Spring Security 不熟悉,需要先学习相关知识。

  2. 示例代码是基于前后端分离架构,并且使用了JWT作为身份认证和授权机制。因此您还需要学习前后端分离架构和JWT相关知识。

  3. 示例代码仅适用于Demo项目,未经过严格测试,不适用于生产环境代码,建议使用时进行适度修改。

Demo项目源码可以在github上找到:Spring-Boot-JWT Example

以上就是 Spring Boot整合JWT的实现步骤的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot整合JWT的实现步骤 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java使用httpclient发送post请求示例

    下面是关于 Java 使用 HttpClient 发送 POST 请求的完整攻略。 组件 在 Java 中发送 HTTP 请求,我们可以使用 Apache 的 HttpClient 组件,它提供了一系列的 API 帮助我们创建和发送请求。 在使用 HttpClient 组件之前,需要下载 HttpClient 组件的 jar 包,并将其添加到项目依赖中。 P…

    Java 2023年5月26日
    00
  • springboot pojo对象日期属性的问题

    首先,要讲解SpringBoot POJO对象日期属性的问题,我们需要了解Java中日期类型的常见问题。Java中日期类型有多种,如java.util.Date、java.util.Calendar等,但是这些类型在处理过程中经常会出现时间格式转换错误等问题。因此Java8中新增了java.time.LocalDateTime和java.time.Local…

    Java 2023年5月26日
    00
  • 解决JavaWeb读取本地json文件以及乱码的问题

    针对“解决JavaWeb读取本地json文件以及乱码的问题”,我提供以下完整攻略: 1. 确认本地json文件的格式和编码类型 在读取本地json文件时,首先需要确认文件的格式和编码类型。常见的json格式有两种:一是普通json格式,文件后缀为.json;二是jsonp格式,文件后缀为.js,其中以javascript对象的方式来表示json数据。 接下来…

    Java 2023年5月26日
    00
  • java 抓取网页内容实现代码

    Java 抓取网页内容实现代码的完整攻略分为以下几个步骤: 建立与目标网站的网络连接。 Java 通过 URL 对象建立与目标网站的网络连接。URL 对象通过带参数的构造函数传入要访问的网站地址。 URL url = new URL("https://www.example.com"); 获取网络连接的输入流。 通过 URL 对象的 op…

    Java 2023年5月23日
    00
  • java算法题解Leetcode763划分字母区间示例

    下面是“java算法题解Leetcode763划分字母区间示例”的完整攻略。 题目描述 给定一个仅包含小写字母的字符串 S,将字符串 S 划分为尽可能多的区间,使得每个字母最多出现在一个区间中,求区间的个数。 解题思路 首先,我们可以使用hashmap记录每个字母最后出现的位置,然后使用两个指针,分别记录当前合法区间的左右端点。 接着,我们遍历字符串S,记录…

    Java 2023年5月19日
    00
  • 深入了解Java中的static关键字

    深入了解Java中的static关键字 在Java中,static是一个用于修饰变量、方法和内部类等的关键字。它表示这些成员属于类本身,而不是类的实例,因此,我们可以直接通过类名来调用这些成员,无需先实例化对象。 static变量 在Java中,静态变量是共享的、存储在堆区的变量。即,无论创建多少实例对象,它们都只有一个拷贝。我们可以通过类名加点的形式进行直…

    Java 2023年5月26日
    00
  • MyBatis注解式开发映射语句详解

    下面我将为您详细讲解“MyBatis注解式开发映射语句详解”的攻略。 什么是MyBatis注解式开发 MyBatis是一个开源持久层框架,它通过XML或注解的方式来实现面向关系型数据库的操作。在MyBatis中,我们可以使用注解来直接编写SQL语句,而不需要编写XML文件。 MyBatis注解式开发的优点 使用注解式开发,可以减少编写XML文件的工作量,直接…

    Java 2023年5月20日
    00
  • SpringBoot Security实现单点登出并清除所有token

    要实现Spring Boot Security的单点登出并清除所有token,可以遵循以下步骤: 配置SecurityConfig 在Spring Security的配置类中,可以使用logout()方法来设置单点登出和清除所有token的相关配置。示例代码如下: @Configuration @EnableWebSecurity public class …

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部