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来定…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

