SpringDoc基础配置和集成OAuth2登录认证教程
本期内容
- 学会通过注解和Java代码的方式添加SpringDoc配置。
- 在swagger-ui提供的页面上提供OAuth2登录认证,在集成Security的情况下便捷获取access_token并在请求时按照OAuth2规范携带。
为什么集成OAuth2登录认证?
现在大部分教程是在swagger-ui页面添加一个请求头,使用时先去获取一个token,然后再将获取的token填充至页面的token输入框内,如果是通过某个接口自己生成token的方式使用这种配置没什么太大问题,但是如果是通过OAuth2登录获取token时就比较麻烦,要填充token type和access token,所以在swagger-ui提供的页面中提供OAuth2登录的入口,OAuth2登录自动配置,一步到位。
配置方式说明
SpringDoc提供了两种方式来添加配置:
- 注解
- Java类的方式
注解
注解配置类
配置方式如下代码所示,详细内容请看代码中的注释
package com.example.config;import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.info.License;
import io.swagger.v3.oas.annotations.security.OAuthFlow;
import io.swagger.v3.oas.annotations.security.OAuthFlows;
import io.swagger.v3.oas.annotations.security.OAuthScope;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.annotations.security.SecuritySchemes;
import org.springframework.context.annotation.Configuration;/*** Spring Doc OpenApi 注解配置** @author vains*/
@Configuration
@OpenAPIDefinition(info = @Info(// 标题title = "${custom.info.title}",// 版本version = "${custom.info.version}",// 描述description = "${custom.info.description}",// 首页termsOfService = "${custom.info.termsOfService}",// licenselicense = @License(name = "${custom.license.name}",// license 地址url = "http://127.0.0.1:8080/example/test01")),// 这里的名字是引用下边 @SecurityScheme 注解中指定的名字,指定后发起请求时会在请求头中按照OAuth2的规范添加tokensecurity = @SecurityRequirement(name = "${custom.security.name}")
)
@SecuritySchemes({@SecurityScheme(// 指定 SecurityScheme 的名称(OpenAPIDefinition注解中的security属性中会引用该名称)name = "${custom.security.name}",// 指定认证类型为oauth2type = SecuritySchemeType.OAUTH2,// 设置认证流程flows = @OAuthFlows(// 设置授权码模式authorizationCode = @OAuthFlow(// 获取token地址tokenUrl = "${custom.security.token-url}",// 授权申请地址authorizationUrl = "${custom.security.authorization-url}",// oauth2的申请的scope(需要在OAuth2客户端中存在)scopes = {@OAuthScope(name = "openid", description = "OpenId登录"),@OAuthScope(name = "profile", description = "获取用户信息"),@OAuthScope(name = "message.read", description = "读"),@OAuthScope(name = "message.write", description = "写")}))
)})
public class SpringDocAnnoConfig {
}
yml中的配置
custom:info:title: example-apiversion: 0.0.1description: 这是一个使用SpringDoc生成的在线文档.terms-of-service: http://127.0.0.1:8080/example/test01license:name: Apache 2.0security:name: Authenticatetoken-url: http://kwqqr48rgo.cdhttp.cn/oauth2/tokenauthorization-url: http://kwqqr48rgo.cdhttp.cn/oauth2/authorize
注意:要想请求时携带登录获取的access_token,@OpenAPIDefinition注解中必须指定security属性,并且name值要和@SecurityScheme注解中的name属性一致。
还有一件事,@SecuritySchemes注解可以直接替换为@SecurityScheme注解,只指定一种认证方式。
还有一件事,使用注解的方式可以直接从yml中获取yml配置文件中的值,当然也可以直接使用具体的常量值(e.g. @License注解中的url属性)。
还有一件事,如果该配置类上只有@OpenAPIDefinition或 @SecurityScheme注解,并且该配置类中没有任何实现,则该配置类会在本机编译时消失,请添加@Configuration注解避免这种情况。
官网原文:If you give @OpenAPIDefinition or @SecurityScheme to a class that has no implementation, that class will disappear when you natively compile. To avoid this, give the class a @Configuration.
还有一件事…
Java代码配置
这里的注意事项和上边注解配置是一样的,不过由注解转为了Java类。
配置方式如下代码所示,详细内容请看代码中的注释
package com.example.config;import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlow;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Spring Doc OpenApi Java代码配置** @author vains*/
@Configuration
public class SpringDocBeanConfig {@Beanpublic OpenAPI customOpenAPI() {// 基础信息Info info = new Info().title("example-api-java").version("0.0.1").description("这是一个使用SpringDoc生成的在线文档.").termsOfService("http://127.0.0.1:8080/example/test01").license(new License().name("Apache 2.0").url("http://127.0.0.1:8080/example/test01"));// 组件Components components = new Components();// 安全认证组件SecurityScheme securityScheme = new SecurityScheme();// 创建一个oauth认证流程OAuthFlows oAuthFlows = new OAuthFlows();// 设置OAuth2流程中认证服务的基本信息OAuthFlow oAuthFlow = new OAuthFlow()// 授权申请地址.authorizationUrl("http://kwqqr48rgo.cdhttp.cn/oauth2/authorize")// 获取token地址.tokenUrl("http://kwqqr48rgo.cdhttp.cn/oauth2/token").scopes(new Scopes().addString("openid", "OpenId登录").addString("profile", "获取用户信息").addString("message.read", "读").addString("message.write", "写"));// 使用授权码模式oAuthFlows.authorizationCode(oAuthFlow);// OAuth2流程securityScheme.flows(oAuthFlows).type(SecurityScheme.Type.OAUTH2);// 安全认证名String securityName = "Authenticate";// 将认证配置加入组件中components.addSecuritySchemes(securityName, securityScheme);SecurityRequirement securityRequirement = new SecurityRequirement();// 将安全认证和swagger-ui关联起来securityRequirement.addList(securityName);return new OpenAPI()// 基础描述信息.info(info)// 添加OAuth2认证流程组件.components(components)// 添加请求时携带OAuth2规范的请求头(通过OAuth2流程获取token后发请求时会自动携带Authorization请求头).addSecurityItem(securityRequirement);}}
效果预览
启动项目后打开提供的在线文档地址:
http://127.0.0.1:8080/swagger-ui/index.html
右侧多了一个Authorize按钮。
操作演示流程如下

其它基础配置
关于springdoc-openapi-core-properties和swagger-ui properties在官网中有详细的介绍了,就不展开说明了,读者可以对照文档在yml中添加自己的相关配置。
附录
- SpringDoc官网
- 代码仓库:Gitee、Github
相关文章:
SpringDoc基础配置和集成OAuth2登录认证教程
本期内容 学会通过注解和Java代码的方式添加SpringDoc配置。在swagger-ui提供的页面上提供OAuth2登录认证,在集成Security的情况下便捷获取access_token并在请求时按照OAuth2规范携带。 为什么集成OAuth2登录认证? 现在大部分教程是在swagger-ui页面添…...
链路聚合-静态和动态区别
链路聚合之动静态聚合方式 链路聚合组是由一组相同速率、以全双工方式工作的网口组成。 1、动态聚合: 动态聚合对接的双方通过交互LACP(链路聚合控制协议)协议报文,来协商聚合对接。 优点:对接双方相互交互端口状态信息,使端口…...
发币成功,记录一下~
N年前就听说了这样一种说法——“一个熟练的区块链工程师,10分钟就可以发出一个新的币” 以前仅仅是有这么一个认识,但当时并不特别关注这个领域。 最近系统性学习中,今天尝试发币成功啦,记录一下~ 发在 Sepolia Tes…...
一个完备的手游地形实现方案
一、地形几何方案:Terrain 与 Mesh 1.1 目前手游主流地形几何方案分析 先不考虑 LOD 等优化手段,目前地形的几何方案选择有如下几种: 使用 Unity 自带的 Terrain使用 Unity 自带的 Terrain,但是等美术资产完成后使用工具转为 M…...
vite vue3配置axios
准备 参考 安装axios yarn add axios中文官网 src下新建request文件夹,该文件下新建index.ts import axios from axios; import { ElMessage } from element-plus;// const errorCodeType function (code: number): string { // let errMessage: string 未知…...
使用 C 语言快速排序将字符串按照 ASCII 码升序排列
示例代码: #include <stdio.h> #include <string.h> #include <stdlib.h>static Comp(const void *a, const void *b) {char *pa (char *)a;char *pb (char *)b;return strcmp(a, b); }int main(void) {char strs[3][10] { "bd", &q…...
自动化运维中间件架构概况
自动化运维中间件架构概况 kubernetesjenkins 安装k8s后 设置 Jenkins 任务: 在 Jenkins 中创建一个新的任务: 配置源代码管理:选择 Git,并提供 GitLab 仓库的 URL、凭据和分支信息。配置构建步骤:选择 Maven 构建,…...
fractional Brownian Motion driven stochastic integrals
See https://mathoverflow.net/questions/304366/fractional-brownian-motion-driven-stochastic-integrals...
c++模式之单例模式详解
c模式之单例模式详解 1.概念2.懒汉模式示例(缺点)3.懒汉模式线程安全4.饿汉式创建单例5.饿汉模式线程示例 1.概念 单例模式是指在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性. 使用单例两个原因:…...
【gpts】学算法题[缺失的第一个正数](https://leetcode.cn/problems/first-missing-positive/)
给出你的题解 (https://leetcode.cn/problems/first-missing-positive/) public class Solution { public int firstMissingPositive(int[] nums) {int len nums.length;for (int i 0; i < len; i) {while (nums[i] > 0 && nums[i] < len && nums…...
车牌识别 支持12种中文车牌类型 车牌数据集下载
开源代码 如果觉得有用,不妨给个Star⭐️🌟支持一下吧~ 谢谢! Acknowledgments & Contact 1.WeChat ID: cbp931126 2.QQ Group:517671804 加微信(备注:PlateAlgorithm),进讨论群可以获得10G大小的车牌检测和识…...
Servlet---上传文件
文章目录 上传文件的方法上传文件的示例前端代码示例后端代码示例 上传文件的方法 上传文件的示例 前端代码示例 <body><form action"upload" method"post" enctype"multipart/form-data"><input type"file" name&qu…...
量子计算+物流!“最后一英里”配送难题Unisys成功实时决策
(图片来源:网络) 此前,供应链行业一直致力于手工操作,严重依赖于纸质系统。后来随着客户需求的不断变化,这种传统方法逐渐显出不足之处。供应链行业正在迅速转向现代化,采用自动化和数据驱动的…...
2023年【四川省安全员A证】复审考试及四川省安全员A证考试试题
题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证复审考试根据新四川省安全员A证考试大纲要求,安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编,组成一套四川省安全员A证全真模拟考试试题,学员可通过…...
C++刷题 -- 二分查找
C刷题 – 二分查找 文章目录 C刷题 -- 二分查找一、原理二、例题1.二分查找2.使用二分查找确定target左右边界3.x的平方根 一、原理 条件:数组为有序数组,数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能…...
PHPmail 发送邮件错误 550 的原因是什么?
电子邮件错误消息链接到简单邮件传输协议 (SMTP),这是一组发送和接收电子邮件的标准化规则。因此,它也称为 SMTP 550 错误代码。在某些情况下,电子邮件错误 550 是由收件人一方的问题引起的。 以下是电子邮件错误 550 的一些可能原因&#x…...
数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大难点分析
数字化时代银行网点厅堂营销存在以下5大难点: 1、识别难。识别有效的客户比较难,传统的厅堂识别主要依据客户的衣着气质等主管感受,判断客户是否为潜在中高端客户,提供相关服务。大堂经理主管识别与智能化系统识别相结合…...
www.testfire.nets渗透测试报告
www.testfire.nets渗透测试报告 一、测试综述 1.1.测试⽬的 通过实施针对性的渗透测试,发现testfire.net⽹站的安全漏洞,锻炼自己的渗透水平 1.2.测试范围 域名:www.testfire.net IP:65.61.137.117 测试时间: 2023年11月…...
多模态大一统:通向全模态学习和通用人工智能的未来之路
随着AI技术的不断发展,研究者们正试图构建一种真正通用的人工智能,它能像人们那样以统一的方式处理和理解多种模态的信息。多模态大一统是这一愿景的关键,它旨在开启全模态LLM(深度学习语言模型)和通用AI时代的大门。在…...
实用篇-ES-DSL查询文档
数据的存储不是目的,我们希望从海量的酒店数据中检索出需要的信息,这就是ES的搜索功能 官方文档: https://elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl。DSL是用来查询文档的 Elasticsearch提供了基于JSON的DSL来定…...
CANN/cann-recipes-infer:NPU DeepSeek-V4 TileLang算子开发实践
NPU DeepSeek-V4 TileLang算子开发实践 【免费下载链接】cann-recipes-infer 本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-infer 简介 在大模型异构计算发展背景…...
视频动作识别可解释性:REVEX框架与六种移除式解释方法评测
1. 项目概述:当AI“看”视频时,我们如何理解它的“思考”?在动作识别领域,AI模型已经能够以惊人的准确率识别视频中的人类行为,从简单的“走路”、“跑步”到复杂的“打篮球”、“弹钢琴”。然而,一个长期困…...
通过 Taotoken 管理控制台精细化设置 API Key 的访问权限与审计日志
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 Taotoken 管理控制台精细化设置 API Key 的访问权限与审计日志 在团队协作或项目开发中,统一管理大模型 API 的调…...
AI Agent技能库标准化实践:提升开发效率与跨平台兼容性
1. 项目概述:AI Agent技能库的标准化实践 如果你和我一样,每天都在和Claude Code、Cursor这类AI编程工具打交道,那你肯定遇到过这样的场景:想让AI帮你分析一个PDF文件,或者写个SQL优化建议,结果发现每次都…...
ViGEmBus内核级游戏控制器模拟:架构解析与高级故障排除方案
ViGEmBus内核级游戏控制器模拟:架构解析与高级故障排除方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在游戏开发、输入设备测试和远程游戏…...
Switch Transformers:稀疏激活MoE模型原理与工程实践指南
1. 项目概述:Switch Transformers 的革新与挑战最近在开源社区里,Switch Transformers 这个项目又火了一把。如果你关注过大规模语言模型,特别是像 GPT-3、T5 这类巨无霸,那你肯定知道它们的训练成本高得吓人,动辄需要…...
2026 年 AI 记忆工程实战:从 “健忘大模型” 到 “可持久化数字记忆”
摘要 大模型正在从 “对话玩具” 走向 “生产力工具”,但记忆缺失、上下文漂移、长期对话断裂,依然是落地最大瓶颈。2026 年,AI 记忆工程(Memory Engineering) 已成为与提示词工程、智能体工程并列的核心技术方向。本文…...
深入V4L2内核:当DQBUF卡在wait_event时,我们该如何调试与自救?
深入V4L2内核:当DQBUF卡在wait_event时的调试与解决方案 在Linux视频开发领域,V4L2框架是连接用户空间和摄像头驱动的核心桥梁。然而,当用户态应用调用VIDIOC_DQBUF时,有时会遇到进程永久阻塞的情况,特别是在设备异常状…...
在Taotoken平台查看与导出详细账单数据的操作方法
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Taotoken平台查看与导出详细账单数据的操作方法 对于使用大模型API进行开发的团队或个人而言,清晰、准确地掌握成本消…...
WPF动态换肤太难?巧用ResourceDictionary.MergedDictionaries,5步实现主题切换
WPF动态换肤实战:用MergedDictionaries打造多主题应用 每次打开软件都被默认的亮色主题刺得眼睛生疼?作为开发者,我们完全可以用WPF的ResourceDictionary.MergedDictionaries为应用赋予动态切换皮肤的能力。下面这个场景你一定不陌生…...

