spring boot3 集成jjwt(java-jwt)版本的

1、安装maven依赖

复制代码
<dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.5.1</version>
            <scope>compile</scope>
        </dependency>

2、新建用户模拟类,例如

复制代码
public class SystemUserVO extends BaseEntity {

    @NotNull(message = "账号不能为空")//空校验
    @NotBlank(message = "账号不能为空") //不能为空字符串
    private String account;

    private String password;

    @NotNull(message = "用户名不能为空")//空校验
    @NotBlank(message = "用户名不能为空") //不能为空字符串
    private String userName;


    private String nickName;

    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String email;

    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String phone;

    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate birthday;

    @NotNull(message = "性别不能为空")//空校验
    private Integer sex;

//    @NotNull(message = "用户平台不能为空")//空校验
    private Integer userType;

    @NotNull(message = "状态不能为空")//空校验
    private Integer status;
}

3、新建生成token类和解析方法

复制代码
package com.example.system_manage.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.system_manage.vo.SystemUserVO;
import org.apache.commons.lang3.StringUtils;

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

public class JwtUtil {
    private static long expire_time = 1000 * 60 * 60 * 8;
    private static String signature = "xxxxxxxxx";

    public static String createToken(SystemUserVO user) {
        Date date = new Date(System.currentTimeMillis() + expire_time);
        Algorithm algorithm = Algorithm.HMAC256(signature);
        return JWT.create()
                // 将 user id 保存到 token 里面
                .withAudience(user.getId().toString())
                .withClaim("userName", user.getUserName())
                .withClaim("userId", user.getId())
                .withClaim("userAccount", user.getAccount())
                .withClaim("userType", user.getUserType())
                .withClaim("userTenantIds", user.getSystemUserTenantList().stream().map(v -> v.getUserTenantId().toString()).collect(Collectors.joining(",")))
                .withClaim("userRoleIds", user.getSystemUserRoleList().stream().map(v -> v.getRoleId().toString()).collect(Collectors.joining(",")))
                .withClaim("userDeptIds", user.getSystemUserDeptList().stream().map(v -> v.getDeptId().toString()).collect(Collectors.joining(",")))
                .withClaim("userPostIds", user.getSystemUserPostList().stream().map(v -> v.getPostId().toString()).collect(Collectors.joining(",")))
                // 60分钟后token过期
                .withExpiresAt(date)
                // token 的密钥
                .sign(algorithm);
    }


    /**
     * 接口解析token
     *
     * @param token
     * @return
     */
    public static Map<String, Object> getTokenInform(String token) {
        try {
            if (StringUtils.isBlank(token)) {
                throw new BusinessException("当前无验证令牌");
            }
            Algorithm algorithm = Algorithm.HMAC256(signature);
            JWTVerifier verifier = JWT.require(algorithm)
                    .build();
            DecodedJWT jwt=verifier.verify(token);
            Map<String, Object> result = new HashMap<>();
            result.put("userId", jwt.getClaim("userId").asLong().toString());
            result.put("userName", jwt.getClaim("userName").asString());
            result.put("userAccount", jwt.getClaim("userAccount").asString());
            result.put("userType", jwt.getClaim("userType").asInt());
            result.put("userTenantIds", jwt.getClaim("userTenantIds").asString());
            result.put("userRoleIds", jwt.getClaim("userRoleIds").asString());
            result.put("userDeptIds", jwt.getClaim("userDeptIds").asString());
            result.put("userPostIds", jwt.getClaim("userPostIds").asString());
            return result;
        } catch (JWTVerificationException exception) {
            throw new JWTVerificationException("登录过期,请重新登录");
        } catch (Exception e) {
            throw new BusinessException(e.getMessage());
        }
    }
}

4、然后在拦截器中进行控制,可参考我之前的文章
集成token

注意这个版本的需要把鉴权替换成我这篇文章的

相关推荐
RyFit8 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码9 小时前
C++ 内存分区 堆区
java·开发语言·c++
前端若水9 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
绝知此事9 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海9 小时前
C# 隐式转换深度解析
java·开发语言·c#
涛声依旧-底层原理研究所10 小时前
残差连接与层归一化通俗易懂的详解
人工智能·python·神经网络·transformer
一只大袋鼠10 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
csdn_aspnet10 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
fantasy_arch10 小时前
pytorch人脸匹配模型
人工智能·pytorch·python
熊猫_豆豆10 小时前
广义相对论水星近日点进动完整详细数学推导
python·天体·广义相对论