(六)Gateway开发教程之实现统一授权【集成JWT】

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本篇文章就是告诉大家如何在SpringCloud项目中使用JWT实现统一授权。Gateway中集成统一认证授权,是微服务网关中必然要集成的功能之一,重要性不言而喻.

前情回顾


上篇文章,我们讲到了为什么要选择JWT来实现统一认证授权,其优点更符合初期项目的形成,同样可以通过双token来增强用户的体验度种种,而这些纸上谈兵式的谈论过去,迎来的就是如何去实现这些。


本篇文章就是告诉大家如何在SpringCloud项目中使用JWT实现统一授权。


使用JWT来加密解密


在集成到SpringCloud项目中之前,我们要先做一些JWT技术的调研,但是要调研到什么程度才能做到集成的基本要素呢?


如果你问我,我会告诉你,最起码也要将JWT的token加密、解密弄清楚,或者是调试成功,才能去进行集成至SpringCloud中。


准备工作

首先我们要先提供一个密钥,通过此密钥来进行加解密。

JWT加密

直接贴代码:

String key = Base64.getEncoder().encodeToString("zhegekeysuibianshejijiuxingkannixinqing".getBytes(Charsets.UTF_8));
//用户信息
Map<String,String> map = new HashMap<>();
map.put("userId","zhangsan");
//加密
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
byte[] apiKeySecretBytes = Base64.getDecoder().decode(key);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
JwtBuilder builder = Jwts.builder().signWith(signingKey);
map.forEach(builder::claim);
//输出token
System.out.println(builder.compact());

根据上述代码,我们会生成如下图的一大串token。


b246e8370a2ef7e03a99ec69dd489e6.png


JWT解密


解密的话,其实就是将token解析出相应的用户信息。

Claims claims = Jwts.parserBuilder().setSigningKey(Base64.getDecoder().decode(JwtUtil.key)).build()
      .parseClaimsJws(token).getBody();
System.out.println(claims.get("userId"));

可以得到下图:


12f93bc6a439f65206ebb5c3e35faa9.png


将JWT集成到Gateway中


登录认证

我们在Controller层书写一个LoginController.java类,在其中书写一个获取token的api接口。

@RestController
public class LoginController {
    @PostMapping("/token")
    public R<AuthInfo> token(@RequestParam(required = false) String account,
                                      @RequestParam(required = false) String password) {
        Map<String,String> map = new HashMap<>(16);
        map.put("account", account);
        map.put("password", password);
        String token = JwtUtil.createJwt(map);
        if (userInfo == null || userInfo.getUser() == null || userInfo.getUser().getId() == null) {
            return R.fail();
        }
        return R.success(token);
    }
}

编写过滤器验证token


既然搞定了登录获取token的api接口,我们就要将所有访问的URL链接进行过滤器中进行过滤。

所以接下来我们来书写一个认证过滤器。

public class AuthFilter implements GlobalFilter, Ordered {
   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      String path = exchange.getRequest().getURI().getPath();
      ServerHttpResponse resp = exchange.getResponse();
      String headerToken = exchange.getRequest().getHeaders().getFirst("auth");
      if (StringUtils.isBlank(headerToken)) {
         return unAuth(resp, "缺失令牌,鉴权失败");
      }
      Claims claims = JwtUtil.parseJWT(headerToken);
      if (claims == null) {
         return unAuth(resp, "请求未授权");
      }
      return chain.filter(exchange);
   }
   @Override
   public int getOrder() {
      return -99;
   }
}

总结


Gateway中集成统一认证授权,是微服务网关中必然要集成的功能之一,重要性不言而喻,希望大家可以有所重视。

目录
相关文章
|
5月前
|
Java Maven
2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
这篇文章是一份关于Maven的安装和配置指南,包括下载、环境变量设置、配置文件修改、IDEA集成Maven以及解决jar包下载问题的方法。
2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
|
2月前
|
安全 Java API
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
阿里云短信服务提供API/SDK和控制台调用方式,支持验证码、通知、推广等短信类型。需先注册阿里云账号并实名认证,然后在短信服务控制台申请资质、签名和模板,并创建AccessKey。最后通过Maven引入依赖,使用工具类发送短信验证码。
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
|
3月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
4月前
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
5月前
|
前端开发 Java Maven
【前端学java】全网最详细的maven安装与IDEA集成教程!
【8月更文挑战第12天】全网最详细的maven安装与IDEA集成教程!
119 2
【前端学java】全网最详细的maven安装与IDEA集成教程!
|
5月前
|
JSON 安全 数据安全/隐私保护
Python安全新篇章:OAuth与JWT携手,开启认证与授权的新时代
【8月更文挑战第6天】随着互联网应用的发展,安全认证与授权变得至关重要。本文介绍OAuth与JWT两种关键技术,并展示如何结合它们构建安全系统。OAuth允许用户授权第三方应用访问特定信息,无需分享登录凭证。JWT是一种自包含的信息传输格式,用于安全地传递信息。通过OAuth认证用户并获取JWT,可以验证用户身份并保护数据安全,为用户提供可靠的身份验证体验。
69 6
|
6月前
|
Java 索引 Spring
教程:Spring Boot中集成Elasticsearch的步骤
教程:Spring Boot中集成Elasticsearch的步骤
|
6月前
|
Java API Spring
教程:Spring Boot中如何集成GraphQL
教程:Spring Boot中如何集成GraphQL
|
6月前
|
缓存 Java Spring
教程:Spring Boot中集成Memcached的详细步骤
教程:Spring Boot中集成Memcached的详细步骤
|
7月前
|
搜索推荐 Java 索引
教程:Spring Boot中集成Elasticsearch的步骤
教程:Spring Boot中集成Elasticsearch的步骤