关于gateway与oauth2的兼容问题处理

server/2024/10/21 18:48:11/

文章目录

  • 前言
  • 问题
  • 解决方案
    • 手写RPC
    • 采用spring feign调用
    • 采用JWT解析

前言

令牌鉴权方案的选择上,比较流行的有spring security + 自定义的令牌(比如JWT令牌)、spring security+oauth2,假如使用了spring security + oauth2的方案,在使用上oauth2提供有ResourceServerTokenServices用于解决资源服务对令牌的权限的校验,当访问资源服务的时候,token令牌经过ResourceServerTokenServices的loadAuthentication方法完成验证。

但是当服务无需做非常细致的服务划分的时候,也就是将一个项目当做一个整体资源,这个时候就涉及到在网关校验即可,其他微服务无需二次校验。

问题

目前流行的网关方案是spring gateway(spring框架),但是gateway为了实现高效,底层使用Spring WebFlux,Spring WebFlux是Spring 5.0引入的新的响应式框架,区别于SpringMVC,它不需要依赖Servlet API,它是完全异步非阻塞的,所以引入oauth2-resource的时候会发现启动报错,配置需要基于servlet。

解决方案

手写RPC

手写http访问oauth2的check_token接口实现对token令牌的校验,实现起来比较简单,可以用在网关的过滤器上。下面举个例子

  WebClient webClient = WebClient.create("http://localhost:9900");webClient.post().uri("/oauth/check_token?token=" + token.substring(7)).header("Authorization", basic).exchange().flatMap(response -> {HttpStatus status = response.statusCode();if (status.is2xxSuccessful()) {return response.bodyToMono(Map.class);} else {return response.createException().flatMap(Mono::error);}}).subscribe(responseBody -> {log.info("post请求响应数据:{}", responseBody);if (Objects.isNull(responseBody) || responseBody.isEmpty()) {return;}}, error -> {log.error("post请求发生异常:", error);});

采用spring feign调用

据说在高版本需要对feign调用进行改造完成响应式的feign,因为spring自身并没有提供解决方案,暂时不在考虑范围。目前基于jdk8的最高版本也就是2.7.18,并没有这困扰。

下面Mono是用于测试响应式的feign调用

@FeignClient(name = ServerNameConstant.AUTHORITY_CENTER, path = "/authorityCenter/auth", fallback = AuthRemoteFallback.class)
public interface AuthRemote {/*** 获取用户信息和权限** @param in token* @return 用户信息* @author zfj* @date 2024/1/19*/@PostMapping("/getUser")ResponseVO<UserResDTO> getUser(@RequestBody GetUserReqDTO in);/*** 获取用户信息和权限** @param in token* @return 用户信息* @author zfj* @date 2024/1/19*/@PostMapping("/getUserMono")Mono<ResponseVO<UserResDTO>> getUserMono(@RequestBody GetUserReqDTO in);}

网关过滤器中调用

ResponseVO<UserResDTO> res = oauthRemote.getUser(new GetUserReqDTO(token));

采用JWT解析

JWT具有去中心化的特点,也就能实现无需访问oauth2的鉴权服务就能自行解析令牌,但是也会带来风险,就是秘钥泄露,所以这种方案不能用于安全性要求高的服务。

oauth2也针对JWT提供一个方案(假设不是用resource依赖包,等你升级到spring 3版本以后就能知道了,低版本还可以用spring cloud oauth2,高版本就必须用resource),这个方案考虑到秘钥安全,采用数字自签证书实现公钥的分发,就能很好的避免伪造令牌问题(除非私钥也泄密,那就另外采取一套措施保护私钥)。


http://www.ppmy.cn/server/90116.html

相关文章

【Rust日报】跨平台高性能计算语言扩展CubeCL

[rust is best]10 亿行挑战方案 作者尝试优化 Rust 中「10 亿行挑战」的解决方案。从原始的 5 分钟优化到了 9 秒。 作者的主要目标是创建一段简单、可维护且生产就绪的代码&#xff0c;而且没有使用不安全的操作。以下是一些关键经验&#xff1a; 使用 --release 优化构建避免…

【Android】安卓四大组件之广播知识总结

文章目录 动态注册使用BroadcastReceiver监听Intent广播注册Broadcast Receiver 静态注册自定义广播标准广播发送广播定义广播接收器注册广播接收器 有序广播修改发送方法定义第二个广播接收器注册广播接收器广播截断 使用本地广播实践-强制下线使用ActivityCollector管理所有活…

LLM 大语言模型显存消耗估计与计算

LLM 大语言模型显存消耗估计与计算 1. LLM 大语言模型开发流程 在大模型&#xff08;如 LLaMA-7B、GPT-3 等&#xff09;的开发、训练、微调、推理和部署过程中&#xff0c;各个阶段的流程都涉及多个复杂的步骤。以下是详细的流程描述&#xff0c;涵盖训练和微调的区别&#…

MySQL数据库(基础篇)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;今天讲解的是MySQL的详细知识点的&#xff0c;希望大家可以收货满满&#xff0c;话不多说&#xff0c;直接开始搞&#xff01; &#x1f525;&#x1f525;&#x1f525;文章专题&#xff1a;MySQL &#x1f63d;感…

从零开始的Python开发日记(4):如何连接SQLite数据库

如何使用Python连接SQLite数据库 SQLite 是一种轻量级的嵌入式数据库&#xff0c;广泛用于小型应用和开发原型。Python 提供了内置的 sqlite3 库&#xff0c;可以方便地连接和操作 SQLite 数据库。本文将介绍如何使用 Python 连接 SQLite 数据库&#xff0c;并包含代码示例。 …

Spring 简化jdbc开发 05

文章目录 1. JdbcTemplate&#xff1a;2.命名参数和占位符3. 异常处理&#xff1a;4. 事务管理&#xff1a; 在 Spring 框架中&#xff0c;通过其提供的 JDBC 抽象和工具类&#xff0c;可以极大地简化 JDBC 的开发过程&#xff0c;减少了传统 JDBC 开发中的样板代码和错误处理。…

微信答题小程序产品研发-UI界面设计

高保真原型虽然已经很接近产品形态了&#xff0c;但毕竟还不能够直接交付给开发。这时就需要UI设计师依据之前的原型设计&#xff0c;进一步细化和实现界面的视觉元素&#xff0c;包括整体视觉风格、颜色、字体、图标、按钮以及交互细节优化等。 UI设计不仅关系到用户的直观感…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的&#xff0c;因此你可以根据需要测量的距离&#xff0c;自定义深度相机安装基线&#xff0c;并根据你的项目要求&#xff08;分辨率、快门类型、FPS、光学元件&#xff…