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

【SpringBoot】使用JWT验证

文章目录

  • 简介
  • 使用
    • 生成Token
    • 验证Token
    • 获取Token载荷中的信息
    • 完整代码

简介

JWT,全称为 JSON Web Token,是一种基于 JSON 的开放标准(RFC 7519),用于在不同应用之间传递信息的简洁、安全的标准。JWT 通常被用来在客户端和服务器之间传递身份信息,以实现用户认证和授权等功能。

JWT 主要由三部分组成:

  • 头部(Header) :头部包含 JWT 的类型(即“JWT”)和所使用的算法(如 HS256 或 RS256 等)。
  • 载荷(Payload) :载荷部分用于存储 JWT 的有效负载信息,包括用户信息、权限、过期时间等。
  • 签名(Signature):签名部分是对头部和载荷进行签名的结果,用于保证 JWT 的完整性和真实性。

JWT 的主要优点是简洁、安全、易于传递和存储。由于 JWT 包含了完整的用户信息,因此不需要在每次请求时重新向服务器发送用户信息,从而减少了网络流量和服务器压力。此外,JWT 还可以使用公钥和私钥进行签名和验证,确保 JWT 的安全性。

使用

在pom.xml中引入

<dependency>
   <groupId>com.auth0</groupId>
   <artifactId>java-jwt</artifactId>
   <version>3.4.0</version>
</dependency>

测试环境为Spring Boot 2.3.3

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.peng.entity.User; // 用户实体类
import java.util.Calendar;

生成Token

用于用户登陆成功时,生成Token返回给前端,前端浏览器通本地存储。

    /**
     * 生成token
     * @param user  //传入payload
     * @return 返回token
     */
    public static String getToken(User user){
        // 创建Token 并存入信息
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("userName",user.getUserName());
        builder.withClaim("phone",user.getPhone());
        builder.withClaim("id",user.getId());
        builder.withClaim("role",user.getRole());
        builder.withClaim("age",user.getAge());
        // 存入过期时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,1);
        builder.withExpiresAt(instance.getTime());
        // 加密并返回
        return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
    }

验证Token

用于验证前端提交到后端的Token是否有效未过期。

   /**
     * 验证token
     * @param token
     * @return
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
    }

获取Token载荷中的信息

获取在生产Token时存入的用户信息。

    /**
     * 得到token中的信息
     * @param token
     * @return
     */
    public static User getInfo(String token){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
        User user = new User();
        user.setId(verify.getClaim("id").asLong());
        user.setUserName(verify.getClaim("userName").asString());
        user.setPhone(verify.getClaim("phone").asString());
        user.setRole(verify.getClaim("role").asString());
        System.out.println("JTWUtils.java: getInfo()中的获取的用户信息:"+user.toString());
        return user;
    }

完整代码

package com.peng.framework.jwt;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.peng.entity.User;
import java.util.Calendar;

/**
 * @Author 
 * @Date 2021-02-08 7:46 下午
 * @Description
 */
public class JWTUtils {
    private static String TOKEN = "token!Q@W3e4r";

    /**
     * 生成token
     * @param user  //传入payload
     * @return 返回token
     */
    public static String getToken(User user){
        // 创建Token 并存入信息
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("userName",user.getUserName());
        builder.withClaim("phone",user.getPhone());
        builder.withClaim("id",user.getId());
        builder.withClaim("role",user.getRole());
        builder.withClaim("age",user.getAge());
        // 存入过期时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,1);
        builder.withExpiresAt(instance.getTime());
        // 加密并返回
        return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
    }
    /**
     * 验证token
     * @param token
     * @return
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
    }
    /**
     * 获取token中payload
     * @param token
     * @return
     */
    public static DecodedJWT getTokenPayload(String token){
        return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
    }

    /**
     * 得到token中的信息
     * @param token
     * @return
     */
    public static User getInfo(String token){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
        User user = new User();
        user.setId(verify.getClaim("id").asLong());
        user.setUserName(verify.getClaim("userName").asString());
        user.setPhone(verify.getClaim("phone").asString());
        user.setRole(verify.getClaim("role").asString());
        System.out.println("JTWUtils.java: getInfo()中的获取的用户信息:"+user.toString());
        return user;
    }
}


http://www.kler.cn/a/11858.html

相关文章:

  • FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO
  • GFPS技术原理(四)GATT特征值
  • iOS 18.2 重磅更新:6个大动作
  • mapreduce综合应用案例 — 气象数据清洗
  • LeetCode 509.斐波那契数
  • Golang | Leetcode Golang题解之第552题学生出勤记录II
  • Redis 6.0的多线程是如何工作的
  • 决策树算法介绍
  • MySQL索引及SQL优化
  • SpringBoot中对Bean的处理方法以及第三方Bean处理的方式
  • 快问快答--时间序列常用的数据增强方法有哪些?python有集成库吗?
  • pandas中df.groupby详解?
  • 车企跨界背后,智能手机进入新增长时代
  • BBR算法
  • C++——模板初阶与泛型编程
  • 【Linux】进程地址空间
  • 两层神经网络的参数求导过程
  • Redis分布式锁的实现方式及底层原理
  • 数字图像处理(第三版)绪论笔记
  • vue监视数据的原理、收集表单数据
  • 「SQL面试题库」 No_36 树节点
  • 【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)
  • 【算法LearnNO.1】算法介绍以及算法的时间复杂度和空间复杂度
  • Python遥感开发之FY的批量处理
  • 关于二叉树访问顺序的选择题
  • 中核科技:科技匠心 智启未来