Spring Boot 2.6.3 与 Springdoc。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.5</version>
</dependency>
在
applicaton.yaml
中,当我将路径设置为/v3/api-docs或将其删除时,这意味着使用默认路径“/v3/api-docs”。
Swagger UI 页面通过 API 正确显示
http://localhost:8080/swagger-ui/index.html
但是我想覆盖下面的路径
api-docs.path: /bus/v3/api-docs
然后 Swagger UI 显示“无法加载远程配置”错误:
Make sure to add "/v3/api-docs/**" in configure method.
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/swagger-ui/**", "
/v3/api-docs/**");
}
}
我遇到了同样的问题,如果您位于反向代理后面,解决方法是在 application.yml 中添加以下属性
server:
forward-headers-strategy: framework
由于以下原因需要这样做
Swagger 依赖内部路由从客户端的角度发出请求。将服务置于反向代理后面而不提供 X-Forwarded 标头将导致用户无法按预期使用文档
来源 -> https://medium.com/swlh/swagger-spring-boot-2-with-a-reverse-proxy-in-docker-8a8795aa3da4
如果您在应用程序中使用 Spring Security,则必须在配置中包含 URL。 请将下面的代码添加到您的项目中。
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/swagger-ui/**", "/bus/v3/api-docs/**");
}
}
在浏览器中执行“清空缓存并硬刷新”。
我想我已经解决了问题(感谢@Ivan Zaitsev),只是想对答案添加更多说明。
我也更改了 api-docs.path 属性,并且遇到了同样的问题。当我检查 swagger UI 页面上的请求时,swagger-config 请求返回 404,因为它仍在尝试从旧 URL 获取配置。
即使我更改了 api-docs.path 属性,这里还是尝试检索 swagger-config 的请求 URL。 http://localhost:8080/api/v3/api-docs/swagger-config
原来是openapi-ui相关的问题,因为我清除浏览器缓存和cookie后就能够解决了。最好使用隐身浏览器进行测试,因为它不保存会话上的任何数据。
这是一个老问题,但是当我寻找答案时,我来到了这里,所以在我让它与新版本一起工作后,我决定分享我的答案,也许有人觉得它有用。
这是我对 spring security - 3.1.0 和 openApi 2.1.0 的 gradle 实现:
implementation "org.springframework.boot:spring-boot-starter-security:3.1.0"
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0"
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeHttpRequests()
.requestMatchers("/swagger-ui/**",
"/swagger-resources/*",
"/v3/api-docs/**")
.permitAll()
.anyRequest()
.authenticated();
return http.build();
}
}
您需要在 requestMatcher 中指定路径,例如“/bus/v3/api-docs”。 最好的选择是一一实施:
** - 两颗星是通配符。
即使我的 swagger 路径看起来像这样:api/swagger-ui/index.html#/ 我需要添加匹配器:v3/api-docs/** 才能使其工作。
如果您使用SpringBoot v3,则必须使用springdoc-openapi v2:
以gradle为例:
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
如果您使用
org.spring framework.security:spring-security-config:6.1.3
,这将能够帮助您。
@Configuration
@EnableWebSecurity
class WebSecurity {
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http.authorizeHttpRequests {
it.requestMatchers(antMatcher("/swagger-ui/**")).permitAll()
it.requestMatchers(antMatcher("/v3/api-docs/**")).permitAll()
it.anyRequest().authenticated()
}
return http.build()
}
}