探索 API 文档新境界:Swagger 助力生成带权限控制的 API 文档

各位开发者朋友们!在咱们的开发工作里,API 文档就像是项目的说明书,清晰准确的文档能让我们的开发效率大幅提升。而当涉及到权限控制时,如何生成既安全又详细的 API 文档就成了一个关键问题。今天,我就和大家好好唠唠如何用 Swagger 来生成带有权限控制的 API 文档。

准备工作:兵马未动,粮草先行

咱们做开发,就像行军打仗,工具和资源就是我们的“粮草”。在使用 Swagger 生成带权限控制的 API 文档之前,得先把相关的依赖添加到项目里。如果你用的是 Maven 项目,在 pom.xml 里加上下面这些依赖:

 
<dependencies><!-- Swagger API 注解 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!-- Swagger UI --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>

这些依赖就像是我们的武器装备,有了它们,我们才能在开发的战场上“披荆斩棘”。

配置 Swagger:搭建文档生成的舞台

有了依赖,接下来就要对 Swagger 进行配置,让它能按照我们的需求生成 API 文档。创建一个 Swagger 配置类,就像给一场演出搭建舞台一样:

 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.basePackage("com.example.controller")).paths(PathSelectors.any()).build();}
}

这里我们指定了要扫描的控制器包路径,这样 Swagger 就能知道从哪里获取 API 的信息了。

权限控制:给文档加上一把安全锁

在实际的项目中,API 文档往往包含了很多敏感信息,所以给文档加上权限控制是非常必要的。我们用 Spring Security 来实现这个功能,创建一个 Spring Security 配置类:

 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs").hasRole("ADMIN").anyRequest().authenticated().and().httpBasic();return http.build();}@Beanpublic UserDetailsService userDetailsService() {UserDetails user =User.withDefaultPasswordEncoder().username("admin").password("password").roles("ADMIN").build();return new InMemoryUserDetailsManager(user);}
}

在这个配置里,我们规定只有拥有 ADMIN 角色的用户才能访问 Swagger UI 和 API 文档相关的路径,就像给文档加上了一把安全锁,只有有钥匙的人才能打开。

给 API 加上权限注解:让文档清晰明了

在控制器的方法上,我们要添加权限注解和 Swagger 注解,这样在生成的文档里就能清楚地看到每个 API 的权限要求了:

 
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
@Api(value = "示例 API", description = "这是一个带有权限控制的示例 API 文档")
public class ExampleController {@GetMapping("/hello")@ApiOperation(value = "获取问候语", notes = "需要 ADMIN 角色才能访问")@PreAuthorize("hasRole('ADMIN')")public String hello() {return "Hello, World!";}
}

这里用 @PreAuthorize 注解对方法进行权限控制,同时在 @ApiOperation 注解的 notes 属性中说明权限要求,就像给每个 API 贴上了一个“使用说明”。

查看文档:开启探索之旅

当我们完成了以上所有步骤,就可以启动 Spring Boot 应用程序,然后访问 http://localhost:8080/swagger-ui.html(端口号根据实际情况修改)。这时浏览器会弹出 HTTP Basic 认证对话框,输入我们在 SecurityConfig 中配置的用户名和密码(这里是 adminpassword),认证通过后就能看到带有权限信息的 API 文档了,就像打开了一扇通往知识宝库的大门。

注意事项:细节决定成败

在实际项目中,我们要注意一些细节。比如,示例中使用的 withDefaultPasswordEncoder() 并不是很安全,建议使用 BCryptPasswordEncoder 等更安全的密码存储方式。另外,我们可以根据实际业务需求调整权限规则和认证方式,像使用 OAuth2 等。

朋友们,技术的世界就像一片广阔的海洋,我们每一次的探索都是一次成长的机会。通过今天的分享,希望大家能掌握用 Swagger 生成带权限控制的 API 文档的方法,让我们在开发的道路上越走越远,创造出更多优秀的项目!

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

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

相关文章

只需三步!5分钟本地部署deep seek——MAC环境

MAC本地部署deep seek 第一步:下载Ollama第二步:下载deepseek-r1模型第三步&#xff1a;安装谷歌浏览器插件 第一步:下载Ollama 打开此网址&#xff1a;https://ollama.com/&#xff0c;点击下载即可&#xff0c;如果网络比较慢可使用文末百度网盘链接 注&#xff1a;Ollama是…

神经网络常见激活函数 9-CELU函数

文章目录 CELU函数导函数函数和导函数图像优缺点pytorch中的CELU函数tensorflow 中的CELU函数 CELU 连续可微指数线性单元&#xff1a;CELU&#xff08;Continuously Differentiable Exponential Linear Unit&#xff09;,是一种连续可导的激活函数&#xff0c;结合了 ELU 和 …

w~自动驾驶~合集17

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦&#xff01; 在自动驾驶系统当中&#xff0c;感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&#…

Visual Studio 进行单元测试【入门】

摘要&#xff1a;在软件开发中&#xff0c;单元测试是一种重要的实践&#xff0c;通过验证代码的正确性&#xff0c;帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试&#xff0c;包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…

解决珠玑妙算游戏问题:C 语言实现

一、引言 珠玑妙算游戏&#xff08;the game of master mind&#xff09;是一个有趣的逻辑推理游戏。在编程领域&#xff0c;我们可以通过编写代码来模拟游戏中计算猜中与伪猜中次数的过程。本文将详细介绍如何使用 C 语言实现这一功能&#xff0c;并对核心代码进行解析。 二、…

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…

NLP名词解释

序号 NLP层次 名词 解释 1 词法 分词/词性标注 一句话以词切分&#xff0c;NLP第一步&#xff0c;切分的词做词性标注&#xff0c;如动词、名词、谓词等。 实体识别 分词后的实体抽取识别&#xff0c;实体如地点、日期、人物等 实体链接 实体和实体组合链接的物理信…

2024BaseCTF_week4_web上

继续&#xff01;冲冲冲 目录 圣钥之战1.0 nodejs 原型 原型链 原型链污染 回到题目 flag直接读取不就行了&#xff1f; 圣钥之战1.0 from flask import Flask,request import jsonapp Flask(__name__)def merge(src, dst):for k, v in src.items():if hasattr(dst, __geti…

介绍下SpringBoot在分布式架构中,如何实现读写分离

在分布式架构中&#xff0c;Spring Boot 可以通过多种方式实现读写分离&#xff0c;以提升系统性能和扩展性。以下是常见的实现方法&#xff1a; 1. 使用多数据源 通过配置多个数据源&#xff0c;将读操作和写操作分别路由到不同的数据库实例。 实现步骤&#xff1a; 配置多…

摄像头动捕:摄像头+AI精准捕捉动作

在科技蓬勃发展的当下&#xff0c;动作捕捉技术已从最初的小众应用逐渐走进大众视野&#xff0c;广泛渗透到众多领域。其中&#xff0c;摄像头动捕&#xff0c;也就是无穿戴动作捕捉系统&#xff0c;以其独特的技术优势和创新应用&#xff0c;正悄然改变着人们对动作捕捉的认知…

Unity3D Shader 简析:变体与缓存详解

引言 在 Unity3D 中&#xff0c;Shader 是渲染管线的核心部分&#xff0c;负责控制物体的外观和材质表现。Shader 的变体&#xff08;Variants&#xff09;和缓存机制是优化渲染性能的关键。本文将深入探讨 Unity3D 中 Shader 变体的概念、缓存机制以及如何通过代码实现和管理…

机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例

为了简单直观的理解模型训练&#xff0c;我这里搜集了两个简单的实现文本情感分类的例子&#xff0c;第一个例子基于朴素贝叶斯分类器&#xff0c;第二个例子基于逻辑回归&#xff0c;通过这两个例子&#xff0c;掌握词袋模型&#xff08;Bag of Words&#xff09;实现文本情感…

Java JVM(Java Virtual Machine)解析

Java Virtual Machine&#xff08;JVM&#xff09;是Java平台的核心组成部分&#xff0c;它负责执行Java字节码&#xff0c;并提供了一个运行时环境。本文将深入探讨JVM的工作原理、组成部分以及其在Java开发中的重要性。 一、JVM的基本概念 JVM是一个虚拟的计算机&#xff0…

Miniforge —— 轻量化的 conda 解决方案

引言 在日常使用中&#xff0c;我们常常使用 Anaconda 或 Miniconda 来管理 Python 环境和包。但由于 Anaconda/Miniconda 属于商业产品&#xff0c;当企业规模超过一定人数时就会涉及付费问题。相比之下&#xff0c;Miniforge 是由社区主导维护的一个完全免费的替代方案&…

【CS61A 2024秋】Python入门课,全过程记录P7(Week13 Macros至完结)【完结撒花!】

文章目录 关于新的问题更好的解决方案Week13Mon Macros阅读材料Lab 11: Programs as Data, MacrosQ1: WWSD: QuasiquoteQ2: If ProgramQ3: Exponential PowersQ4: Repeat Wed SQL阅读材料Disc 11: MacrosQ1: Mystery MacroQ2: Multiple AssignmentQ3: Switch Optional Contest:…

《Python百炼成仙》11-20章(不定时跟新)

第十一章 条件渡劫if-else问心 武当金顶的云海翻涌着二进制雪暴&#xff0c;七十二峰化作擎天而立的布尔冰柱。叶军踩着《周易》残页跃上紫霄宫檐角&#xff0c;看见薛香被冰封在水晶般的条件表达式中心&#xff1a; if 道心澄澈:破妄剑意 100else:心魔熵值 * 2楔子三元寒渊 …

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

数据结构与算法之数组: LeetCode 905. 按奇偶排序数组 (Ts版)

按奇偶排序数组 https://leetcode.cn/problems/sort-array-by-parity/description/ 描述 给你一个整数数组 nums&#xff0c;将 nums 中的的所有偶数元素移动到数组的前面&#xff0c;后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 示例 1 输入&#xff1a;n…

Qt简单使用正则表达式

正则表达式 用于数据处理&#xff0c;数据查询&#xff0c;数据格式验证&#xff0c;替换文本&#xff0c;提取字串&#xff0c;相比str函数正则技术&#xff0c;开销小 在Qt简单使用正则表达式 在qt中使用类QRegExp类使用正则表达式 需要使用头文件 #include <QRegExp>…