SpringBoot3集成Oauth2.1——4集成Swagger/OpenAPI3
文章目录
- 访问在线文档页面
- 配置OpenApiConfig
在我之前的文章中,写了 SpringBoot3集成OpenAPI3(解决Boot2升级Boot3)
访问在线文档页面
当我们同样在SpringBoot3使用oauth2.1也就是我之前的文章中写的。现在我们要处理下面这两个的问题了。
<!-- 使用springdoc替代springfox集成swagger https://springdoc.org/ --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.8.6</version></dependency><!-- Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 https://doc.xiaominfo.com/ --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version></dependency>
那就是要能访问到我们的openAPI页面,也就是
http://127.0.0.1:18080/doc.htmlhttp://127.0.0.1:18080/swagger-ui/index.html
将我们之前的defaultSecurityFilterChain修改即可。
@Bean@Order(3)public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize ->authorize.requestMatchers("/login", // 登录页面"/logout", // 登出端点"/swagger-ui/**", // Swagger UI"/v3/api-docs/**", // OpenAPI文档"/webjars/**", // WebJars资源"/swagger-resources/**", // Swagger资源"/doc.html" // Knife4j文档页面).permitAll().anyRequest().authenticated()).formLogin(Customizer.withDefaults()).logout(Customizer.withDefaults());return http.build();}
此时,就能访问了。
当然,访问嘛,肯定401
以我最常用的knife4j为例。在全局参数的地方,我们是看不到添加认证参数的,只有header和query。
查看官方:https://doc.xiaominfo.com/docs/action/oauth2-implicit,不难发现,确实有knife4j集成oauth的,不过从代码示例来看,Swagger还是2.x版本,而oauth2也是老版本以前的。所以这个集成就没有参考意义了,里面都是一些在SpringBoot3这个版本里面没有的。
所以我们得出了一个结论,那就是官方目前没有新版本的集成(2025年5月22日)
官方代码中,最后的 提交记录也是4年前。
看了下代码,其SpringBoot是2.2.x版本
所以,只能自己想办法了。折腾了一天,以下是参考的资料和文档(主要原因还是目前很多框架组件,其实对SprignBoot3还不是特别兼容,java8 + boot2是真的钉子户)
https://github.com/xiaoymin/knife4j/issues
https://doc.xiaominfo.com/docs/blog
思路就是,类似postman等接口测试一样,在请求中,添加认证参数
配置OpenApiConfig
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpHeaders;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;/*** @Description: OpenAPI配置* @author: 胡涛* @mail: hutao_2017@aliyun.com* @date: 2025年5月22日12:26:35*/
@SpringBootConfiguration
public class OpenApiConfig implements WebMvcConfigurer {@Beanpublic OpenAPI customOpenAPI() {return new OpenAPI().info(new Info().title("用户统一平台").version("1.0").description("用户统一管理平台相关接口文档").contact(new Contact().name("Hutao").email("hutao_2017@aliyun.com"))).addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)).components(new Components().addSecuritySchemes(HttpHeaders.AUTHORIZATION,new SecurityScheme().name(HttpHeaders.AUTHORIZATION).type(SecurityScheme.Type.HTTP).scheme("Bearer").in(SecurityScheme.In.HEADER).bearerFormat("JWT")));}
}
这时候,我们将我们从其他地方获取到的token,放入到这里,记得前面添加Bearer
然而当调用接口,确发现,并没有请求头部参数
原来需要再访问的接口上面,加上SecurityRequirement
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
这时候就能看到请求头里面的认证参数了。
此时,就能正常请求了。
但是吧,这么多接口,咱总不能一个一个的加吧?我们可以实现GlobalOperationCustomizer来添加
import java.util.List;import org.springdoc.core.customizers.GlobalOperationCustomizer;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import lombok.extern.slf4j.Slf4j;@Slf4j
@Component
public class Knife4jOperationCustomizer implements GlobalOperationCustomizer {@Overridepublic Operation customize(Operation operation, HandlerMethod handlerMethod) {List<SecurityRequirement> security = operation.getSecurity();if (security == null) {security = List.of(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));operation.setSecurity(security);}return operation;}
}