这里带有auth2的token认证信息,在使用接口调试的使用,必须在header中加上 bearer c22481ba-d9c0-42b7-a01b-a95ec3e5e8b5
在配置文件中,配置swagger2的开放接口
# 直接放行URL
ignore:
urls:
# swagger放开
- /v2/**
- /swagger-resources/**
- /swagger-resources
- /course/coursebase/**
- /swagger-ui.html
package com.moorgen.hotel.admin.config;
import com.google.common.collect.Lists;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @ClassName SwaggerConfig
* @Description TODO
* @Author lcy
* @Date 17:04 2019/7/27
* @Version 1.0
**/
@Profile({"dev"})
@Configuration
@EnableSwagger2
public class SwaggerConfig {
public SwaggerConfig() {
}
@Bean
public Docket api() {
return (new Docket(DocumentationType.SWAGGER_2)).
apiInfo(apiInfo())
.useDefaultResponseMessages(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.moorgen.hotel.admin.controller"))
.paths(PathSelectors.regex("^(?!auth).*$"))
.build().securitySchemes(securitySchemes()).securityContexts(securityContexts());
}
private List<ApiKey> securitySchemes() {
return Lists.newArrayList(new ApiKey[]{new ApiKey("Authorization", "authorization", "header")});
}
private List<SecurityContext> securityContexts() {
return Lists.newArrayList(new SecurityContext[]{SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$")).build()});
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[]{authorizationScope};
return Lists.newArrayList(new SecurityReference[]{new SecurityReference("Authorization", authorizationScopes)});
}
private ApiInfo apiInfo() {
return (new ApiInfoBuilder()).
title("账户管理中心API").
description("账户管理中心API接口").
termsOfServiceUrl("http://192.168.0.129:9999").
version("1.0").
build();
}
}
package com.moorgen.admin.gateway.config;
import lombok.AllArgsConstructor;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName SwaggerProvider
* @Description TODO
* @Author lcy
* @Date 17:22 2019/7/23
* @Version 1.0
**/
@Component
@Primary
@AllArgsConstructor
public class SwaggerProvider implements SwaggerResourcesProvider {
public static final String API_URI = "/v2/api-docs";
private final RouteLocator routeLocator;
private final GatewayProperties gatewayProperties;
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routes = new ArrayList<>();
//取出gateway的route
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
//结合配置的route-路径(Path),和route过滤,只获取有效的route节点
gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId()))
.forEach(routeDefinition -> routeDefinition.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
//过滤掉hotel-auth和hotel-codegen模块,不加载
.filter(predicateDefinition -> !"hotel-auth".equalsIgnoreCase(routeDefinition.getId()))
.filter(predicateDefinition -> !"hotel-codegen".equalsIgnoreCase(routeDefinition.getId()))
.forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
.replace("/**", API_URI)))));
return resources;
}
private SwaggerResource swaggerResource(String name, String location) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion("2.0");
return swaggerResource;
}
}
package com.moorgen.admin.gateway.handler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;
import java.util.Optional;
/**
* @ClassName SwaggerHandler
* @Description swagger聚合接口,三个接口都是swagger-ui.html需要访问的接口
* @Author lcy
* @Date 19:59 2019/7/25
* @Version 1.0
**/
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerHandler {
@Autowired(required = false)
private SecurityConfiguration securityConfiguration;
@Autowired(required = false)
private UiConfiguration uiConfiguration;
private final SwaggerResourcesProvider swaggerResources;
@Autowired
public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
this.swaggerResources = swaggerResources;
}
@GetMapping("/configuration/security")
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("/configuration/ui")
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("")
public Mono<ResponseEntity> swaggerResources() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
}
到这里基本上大功告成了,我使用的版本:springcloud:Greenwich.SR2,swagger2:2.9.2,没办法,就喜欢用新版本!别给我扯什么稳定不稳定,C语言最稳定,你去用啊!哈哈