【SpringBoot】使用JWT验证

简介

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;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值