Swagger UI 仅为用户暴露已授权终结点

前言

当需要在生产环境中提供 Swagger UI 时,我们可以通过身份验证,控制只有授权用户才能访问 Swagger UI 页面。

但是我们希望更进一步,每个用户只能看到授权给他的终结点,而不会暴露其他未授权终结点信息。

比如, API 提供了方法 A 和 方法 B,而对于用户 zhangsan 来说,他在 Swagger UI 页面只能看到方法 A 的说明,而不会知道方法 B 的存在。

思路

Swagger UI 页面展示的数据来源,其实是/swagger/v1/swagger.json文件:

app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));

swagger.json的格式是遵循 OpenAPI 规范的。

其中,paths定义了 API 的所有终结点:

fea115445774c3e89089d2e601490206.jpeg

那么,只需要保证swagger.json包含的paths仅定义了授权接口的终结点即可。

虽然我们不能控制swagger.json文件的生成,但是我们可以控制它如何输出到响应啊!

我们可以定义一个Middleware,实现如下功能:

  1. 判断当前请求是否swagger.json

  2. 如果是,截获原始响应,即swagger.json文件内容

  3. 创建一个新的 json 文件,遍历swagger.json所有 JSON 结点,写入到新 json 文件中

  4. 如果当前节点是paths节点下的子节点,先判断子节点名称是否是授权终结点,是则写入,否则跳过

  5. 将新 json 文件输出到响应中

实现

SwaggerEndpointsFilterMiddleware实现代码如下:

public class SwaggerEndpointsFilterMiddleware
{private readonly RequestDelegate _next;public SwaggerEndpointsFilterMiddleware(RequestDelegate next){_next = next;}public async Task Invoke(HttpContext httpContext){if (httpContext.Request.Path.Value != null && httpContext.Request.Path.HasValue &&httpContext.Request.Path.Value.Contains("swagger.json", StringComparison.InvariantCultureIgnoreCase)){var originalStream = httpContext.Response.Body;using (var memoryStream = new MemoryStream()){//截获原始响应,将响应内容写入 MemoryStreamhttpContext.Response.Body = memoryStream;await _next(httpContext);//获取当前用户可访问的 Endpointsvar validEndpoints = GetValidEndpoints(httpContext.Request);memoryStream.Position = 0;using (var sr = new StreamReader(memoryStream)){//将修改过的 json 写入响应 await originalStream.WriteAsync(CreateSwaggerJson(sr.ReadToEnd(), validEndpoints));}httpContext.Response.Body = originalStream;return;}}await _next(httpContext);}
}

关键代码在CreateSwaggerJson:

private byte[] CreateSwaggerJson(string json, IEnumerable<string> validEndpoints)
{using (var memoryStream = new MemoryStream()){using (var utf8JsonWriter = new Utf8JsonWriter(memoryStream)){using (var jsonDocument = JsonDocument.Parse(json)){utf8JsonWriter.WriteStartObject();foreach (var element in jsonDocument.RootElement.EnumerateObject()){if (element.Name == "paths"){utf8JsonWriter.WritePropertyName(element.Name);utf8JsonWriter.WriteStartObject();//遍历 paths 子节点,检查 Endpoint 是否已授权foreach (var endpoint in element.Value.EnumerateObject()){if (validEndpoints.Contains(endpoint.Name)){endpoint.WriteTo(utf8JsonWriter);}}utf8JsonWriter.WriteEndObject();}else{element.WriteTo(utf8JsonWriter);}}utf8JsonWriter.WriteEndObject();}}return memoryStream.ToArray();}
}

最后,修改 Startup.cs:

app.UseMiddleware<SwaggerEndpointsFilterMiddleware>();app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));

e7fb4ec328a38e2ec05617714bad5164.gif

结论

今天,我们通过 Middleware 拦截swagger.json的输出,实现了 Swagger UI 仅为用户暴露已授权终结点。

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软正式发布Azure Storage上的静态网站

微软正式宣布了Azure Storage上的静态网站&#xff0c;提供了从托管在Azure Storage上的HTML、CSS和JavaScript文件提供内容的能力。静态网站包含内容固定的Web页面&#xff0c;同时仍然允许利用JavaScript等客户端代码来创建丰富的用户体验。 有了这个新功能&#xff0c;继用于…

帝国国王科技大学上机题解(二)

1.找到字符串中出现次数最少的字符 题目描写叙述 给定一个字符串&#xff08;长度小于50&#xff09; 找到该字符串出现次数最少的字符 假设有两个字符出现次数同样&#xff0c;并且均出现最少。那么ASCII码小的字符优先 输入 输入为一行字符串。不含空格 输出 输出出现次数最少…

如何在计算机上阅读漫画书

Reading and organizing a comic book collection on your computer is efficient and a lot of fun. Today we will look at a couple of free applications that allow you to read your favorite comic books on your computer. 在计算机上阅读和组织漫画集非常有效&#xf…

工业互联网平台实现路径

我国工业互联网平台建设虽然仍处于产业培育期&#xff0c;但是工业互联网平台也得到了初期的快速发展&#xff0c;得益于平台企业的积极投入和各地工业和信息化主管部门的大力推动&#xff0c;从平台建设推广的经验来看&#xff0c;下面谈一下个人认为传统制造企业平台战略比较…

psa name_Windows 10安全性PSA:启用自动商店更新

psa nameMicrosoft sometimes distributes important security updates through the Microsoft Store. That’s the lesson we’re learning in July 2020, when Microsoft sent an important update for Windows 10’s HEVC codecs not via Windows Update but via the Store.…

C# ListView 简单命令例子

编写工具常用到ListView控件&#xff0c;能简单列出选项&#xff0c;常用到流程校验显示。这里介绍简答显示&#xff0c;添加与删除功能。 1.添加表头&#xff0c;与显示。 this.listView1.Columns.Add("队列", 40, HorizontalAlignment.Left);this.listView1.Column…

手机照片丢失或误删如何恢复

手机照片丢失或误删如何恢复&#xff1f;我们每个人从刚出生就开始拍照片&#xff0c;一周岁照片、二周岁照片、三周岁照片等&#xff0c;因为照片可以记录我们从小到大的模样和变化。无意照片对我们每个人来说都很重要&#xff0c;如果手机突然坏以前的照片都找不到了怎么办呢…

C++学习笔记(二)——交换函数(swap)

这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C中如何选择传参方式。 先来看第一段程序&#xff1a; void swap(int x, int y) {int temp y;y x;x temp; } 通过main函数的调用&#xff0c;我们发现x,y并未实现交换&#xff1a; int main() {int x 1;int y…

大数据背后是个万亿市场

2014年的GDP中消费占比已经超过了50%&#xff0c;标志着中国经济正在向市场经济转型&#xff0c;消费占GDP50%&#xff0d;70%是中等发达国家向市场经济过渡的一个表现&#xff0c;未来中国经济增长最大的引擎应该来源于消费&#xff0c;特别是个人消费。中国正在经历经济结构调…

ipad iphone开发_如何将iPhone或iPad置于恢复模式

ipad iphone开发If your iDevice starts acting strangely and you’ve run through the gamut of normal troubleshooting fixes, Recovery Mode may be your answer. This lets you easily reset the device and re-install iOS using iTunes. 如果您的iDevice开始运行异常&a…

从三层架构说起,谈谈对历史项目的小改造

web development项目背景说明最近接手一个 “老” 项目的需求修改&#xff0c;项目整体基于 .net core 3.1 平台&#xff0c;以传统的三层架构为基础构建。了解需求后&#xff0c;逐步对原有项目框架进行大概的了解&#xff0c;主要是熟悉一些框架的开发规范&#xff0c;基本工…

C# message简单实现窗口间信息接收与发送

刚接触windows 不同程序 窗口消息传递&#xff0c;不理解IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam)这函数怎么用&#xff1f;消息内容怎么传递过去&#xff0c;还遇到需要message结构体&#xff1f;IntPtr怎么用呢&#xff1f; 但实际只是用来传个…

在Kubernetes集群上部署和管理JFrog Artifactory

JFrog Artifactory是一个artifacts仓库管理平台&#xff0c;它支持所有的主流打包格式、构建工具和持续集成&#xff08;CI&#xff09;服务器。它将所有二进制内容保存在一个单一位置并提供一个接口&#xff0c;这使得用户在整个应用程序开发和交付过程中&#xff0c;能更易于…

已知思科ASA设备漏洞仍在其新版本中存在

近日&#xff0c;名为“Shadow Brokers(影子经纪人)”的黑客组织声称成功入侵了跟NSA相关的Equation Group(方程式组织)的计算机系统&#xff0c;并成功窃取到了大量的机密信息以及黑客工具。随后&#xff0c;“Shadow Brokers”黑客组织将60%的泄漏文件在网上进行了公布&#…

Yii Listview

转载于:https://www.cnblogs.com/xiong63/p/8546376.html

.NET 7 的 AOT 到底能不能杠反编译?

一&#xff1a;背景 1.讲故事在B站&#xff0c;公众号上发了一篇 AOT 的文章后&#xff0c;没想到反响还是挺大的&#xff0c;都称赞这个东西能抗反编译&#xff0c;可以让破解难度极大提高&#xff0c;可能有很多朋友对逆向不了解&#xff0c;以为用 ILSpy,Reflector,DnSpy 这…

google hdr+_更好的隐私权控制使Google+死了

google hdrEarlier this year, Google started a project to review third-party developer access to Google accounts through the use of APIs. It found a security breach surrounding Google, and is now shutting the service down, at least for consumers. 今年年初&a…

新0-Day漏洞或将给Linux桌面发行版带来浩劫

Linux 的各个发行版都一直强调安全及其相关元素&#xff0c;比如防火墙、渗透测试、沙盒、无痕上网和隐私等等&#xff0c;但事实上可能并没有想象中的那么安全。安全研究员 Chris Evans 公开了其发现的针对 Linux 桌面发行版的 0day 漏洞&#xff0c;利用特制的音频文件入侵 L…

一份详尽的利用 Kubeadm部署 Kubernetes 1.13.1 集群指北

2019独角兽企业重金招聘Python工程师标准>>> 概 述 Kubernetes集群的搭建方法其实有多种&#xff0c;比如我在之前的文章《利用K8S技术栈打造个人私有云&#xff08;连载之&#xff1a;K8S集群搭建&#xff09;》中使用的就是二进制的安装方法。虽然这种方法有利于我…

.NET性能优化-使用内存+磁盘混合缓存

我们回顾一下上一篇文章中的内容&#xff0c;有一个朋友问我这样一个问题&#xff1a;我的业务依赖一些数据&#xff0c;因为数据库访问慢&#xff0c;我把它放在 Redis 里面&#xff0c;不过还是太慢了&#xff0c;有什么其它的方案吗&#xff1f;其实这个问题比较简单的是吧&…