JWT权限认证快速入门

一、登录认证

令牌就是一段字符串

承载业务数据, 减少后续请求查询数据库的次数

防篡改, 保证信息的合法性和有效性

二、JWT简介

三、使用JWT

pom.xml引入起步依赖

XML 复制代码
<!--java jwt坐标-->
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>4.4.0</version>
</dependency>

编写工具类JwtUtil

utils/JwtUtil.java

java 复制代码
package com.devops.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

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

public class JwtUtil {

    private static final String KEY = "devops";

    //接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
        .withClaim("claims", claims)
        .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
        .sign(Algorithm.HMAC256(KEY));
    }

    //接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
        .build()
        .verify(token)
        .getClaim("claims")
        .asMap();
    }

}

单元测试类JwtTest

java 复制代码
package com.example.demo;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

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

@SpringBootTest
public class JwtTest {


    // 生成加密后的token
    @Test
    public void testGen() {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", 1);
        claims.put("username", "张三");
        // 生成jwt代码
        String token = JWT.create()
                .withClaim("user", claims)  // 添加载荷
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))  // 设置过期时间
                .sign(Algorithm.HMAC256("yange"));    // 指定算法,生成密钥
        System.out.println(token);
    }

    // 验证加密后的token
    @Test
    public void testVerify() {
        String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3NjczMTg5ODV9.jRY2E19_CC3qKkZl5poHaHInC7CVLf9bc36geEU2S04";
        try {
            DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256("yange"))
                    .build()
                    .verify(token);
            Map<String, Claim> claims = decodedJWT.getClaims();
            System.out.println(claims.get("user"));
        } catch (Exception e) {
            System.out.println("验证失败");
        }
    }
}

在项目中可以这样使用:

java 复制代码
//使用JwtUtil工具类生成token
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", user.getId());
        claims.put("username", username);
        String token = JwtUtil.genToken(claims);
        return Result.success(token);

最终的结果:

相关推荐
未若君雅裁15 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y16 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手16 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人16 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
阿维的博客日记16 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI16 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
郭涤生17 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS17 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言
卢锡荣17 小时前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
Xin_ye1008617 小时前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#