JWT插件


1.概述

1.1 插件名称

  • jwt 插件

1.2 适用场景

  • 需要在网关统一鉴权。

1.3 插件功能

  • jwt 插件,是针对 http 请求头的 token属性或者是 authorization 属性携带值进行鉴权判断,兼容 OAuth2.0

1.4 插件代码

  • 核心模块为 shenyu-plugin-jwt.
  • 核心类为 org.apache.shenyu.plugin.jwt.JwtPlugin.

1.5 添加自哪个ShenYu版本

  • 自从 ShenYu 2.4.0

2.如何使用插件

2.1 插件使用流程图

JWT插件 - 图1

2.2 导入pom

  1. <dependency>
  2. <groupId>org.apache.shenyu</groupId>
  3. <artifactId>shenyu-spring-boot-starter-plugin-jwt</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>

2.3 启用插件

  • shenyu-admin 基础配置 —> 插件管理 —> jwt ,设置为开启。

2.4 配置插件

2.4.1 Config plugin in ShenYu-Admin

  • 在ShenYu-Admin配置jwt插件的私钥,该私钥必须大于256位 。
  • secretKey : 该私钥为使用jwt时生成token,并且他是必须的。

JWT插件 - 图2

2.4.2 Selector config

2.4.3 Rule Config

JWT插件 - 图3

  • convert是jwt的转化
  • jwtVal: jwt 请求体的名称
  • headerVal: jwt请求头的名称

自定义转化算法请查看:自定义JWT插件转化算法

2.5 示例

2.5.1 使用jwt插件进行权限认证

2.5.1.1 配置jwt插件

JWT插件 - 图4

2.5.1.2 配置选择器

JWT插件 - 图5

2.5.1.3 配置规则

JWT插件 - 图6

2.5.1.4 在网页中生成jwt token

  • 在你的浏览器中打开 https://jwt.io/ , 并且填充对应的参数 。
  • https://jwt.io/ 的页面配置jwt请求头。
  • https://jwt.io/ 的页面配置jwt参数体。
  • https://jwt.io/ 的页面配置jwt签名参数。

JWT插件 - 图7

2.5.1.5 使用Java代码生成jwt token

  1. public final class JwtPluginTest {
  2. public void generateJwtCode() {
  3. final String secreteKey = "shenyu-test-shenyu-test-shenyu-test";
  4. Map<String, String> map = new HashMap<>();
  5. map.put("id", "1");
  6. map.put("name", "xiaoming");
  7. Date date = new Date();
  8. date.setTime(1655524800000L);
  9. String token = Jwts.builder()
  10. .setIssuedAt(date)
  11. .setExpiration(new Date())
  12. .setClaims(map)
  13. .signWith(Keys.hmacShaKeyFor(secreteKey.getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS256)
  14. .compact();
  15. System.out.println(token);
  16. }
  17. }

2.5.1.6 请求服务

2.5.1.6.1 使用token方式请求服务
  • 在你的请求头中附带 token: eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoieGlhb21pbmciLCJpZCI6IjEifQ.LdRzGlB49alhq204chwF7pf3C0z8ZpuowPvoQdJmSRw 字段并发起请求。
2.5.1.6.2 使用认证方式请求服务
  • 在你的请求头中附带 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoieGlhb21pbmciLCJpZCI6IjEifQ.LdRzGlB49alhq204chwF7pf3C0z8ZpuowPvoQdJmSRw 并发起请求。

2.5.1.7 验证请求结果

  • 错误的签名
  1. {
  2. "code": 401,
  3. "message": "Illegal authorization"
  4. }
  • 正确的签名
  1. {
  2. "id": "123",
  3. "name": "hello world save order"
  4. }

3.如何禁用插件

  • shenyu-admin 基础配置 —> 插件管理 —> jwt ,设置为关闭。

JWT插件 - 图8