Search code examples
swagger-uispring-cloud-gateway

Spring cloud gateway with swagger 3 openapi doesn't work


Please help, I tried to configure the security permissionAll endpoint but it still doesn't work:

Swagger config

@Bean
    @Lazy(false)
    public List<GroupedOpenApi> apis(SwaggerUiConfigParameters swaggerUiConfigParameters, RouteDefinitionLocator locator) {
        List<GroupedOpenApi> groups = new ArrayList<>();
        List<RouteDefinition> definitions = locator.getRouteDefinitions().collectList().block();
        for (RouteDefinition definition : definitions) {
            System.out.println("id: " + definition.getId()+ "  "+definition.getUri().toString());
        }
        definitions.stream().filter(routeDefinition -> routeDefinition.getId().matches(".*-service")).forEach(routeDefinition -> {
            String name = routeDefinition.getId().replaceAll("-service", "");
            swaggerUiConfigParameters.addGroup(name);
            GroupedOpenApi.builder().pathsToMatch("/" + name + "/**").group(name).build();
        });
        return groups;
    }

gateway application.yml

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: system-service
          uri: lb://system-service
          predicates:
            - Path=/system/**
          filters:
            - RewritePath=/system/(?<path>.*), /$\{path}
        - id: openapi
          uri: http://localhost:${server.port}
          predicates:
            - Path=/v3/api-docs/**
          filters:
            - RewritePath=/v3/api-docs/(?<path>.*), /$\{path}/v3/api-docs

WebFluxSecurityConfig


private final String[] whiteListSwagger = {
        "/v3/api-docs/**", "/swagger-ui/**", "/webjars/**", "/swagger-ui.html"
};

/**
 * Spring security filter chain security web filter chain.
 *
 * @param http the http
 * @return the security web filter chain
 */
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.cors().configurationSource(corsConfigurationSource()).and().csrf().disable()
            .authorizeExchange()
            .pathMatchers(whiteListOauth2).permitAll()
            .pathMatchers(whiteListSwagger).permitAll()
            .anyExchange().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();

    return http.build();
}

Output

enter image description here

Tks.

I tried to read the document but still not solved the problem.

springdoc-openapi v1.6.12


Solution

  • maybe this will help you:

    https://github.com/springdoc/springdoc-openapi/issues/1678

      @Bean
      MultipleOpenApiWebFluxResource multipleOpenApiResource(
          List<GroupedOpenApi> groupedOpenApis,
          ObjectFactory<OpenAPIService> defaultOpenAPIBuilder,
          AbstractRequestService requestBuilder,
          GenericResponseService responseBuilder,
          OperationService operationParser,
          SpringDocConfigProperties springDocConfigProperties,
          SpringDocProviders springDocProviders) {
        return new MultipleOpenApiWebFluxResource(
            groupedOpenApis,
            defaultOpenAPIBuilder,
            requestBuilder,
            responseBuilder,
            operationParser,
            springDocConfigProperties,
            springDocProviders);
      }