赞
踩
正常使用时,我们的接口需要登陆才能访问的。即登录时,要传一个登陆后的token才能访问的。
那这个怎么设置,才可以让所有接口都允许登陆后访问呢。
设置全局token解决办法如下:
1. 在pom中加入依赖
- <properties>
- <swagger.version>2.9.2</swagger.version>
- </properties>
- <!-- swagger -->
- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger-ui</artifactId>
- <version>${swagger.version}</version>
- </dependency>
- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger2</artifactId>
- <version>${swagger.version}</version>
- <exclusions>
- <exclusion>
- <groupId>io.swagger</groupId>
- <artifactId>swagger-models</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 2.9.2中默认使用的是 swagger-models-1.5.20 版本,该版本中的example只判断了值是否为空,但是并没有判断值是否是空串,映射上就会报 NumberFormatException 异常 -->
- <dependency>
- <groupId>io.swagger</groupId>
- <artifactId>swagger-models</artifactId>
- <version>1.5.21</version>
- </dependency>
2. swagger配置如下
- @Configuration
- @EnableSwagger2
- public class SwaggerConfig {
-
- @Bean
- public Docket platformApi() {
-
- return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).forCodeGeneration(true)
- .select().apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
- .apis(RequestHandlerSelectors.any())
- .paths(regex("^.*(?<!error)$"))
- .build()
- .securitySchemes(securitySchemes())
- .securityContexts(securityContexts());
-
-
- }
- private List<ApiKey> securitySchemes() {
- List<ApiKey> apiKeyList = new ArrayList();
- apiKeyList.add(new ApiKey("token", "token", "header"));
- return apiKeyList;
- }
-
- private List<SecurityContext> securityContexts() {
- List<SecurityContext> securityContexts=new ArrayList<>();
- securityContexts.add(
- SecurityContext.builder()
- .securityReferences(defaultAuth())
- .forPaths(PathSelectors.regex("^(?!auth).*$"))
- .build());
- return securityContexts;
- }
-
- List<SecurityReference> defaultAuth() {
- AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
- AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
- authorizationScopes[0] = authorizationScope;
- List<SecurityReference> securityReferences = new ArrayList<>();
- securityReferences.add(new SecurityReference("token", authorizationScopes));//验证增加(有许多教程说明中这个地方是Authorization,导致不能带入全局token,因为securitySchemes()方法中header写入token,所以这个地方我改为token就可以了)
- return securityReferences;
- }
- private ApiInfo apiInfo() {
- return new ApiInfoBuilder().title("接口文档")
- .description("用于说明接口使用")
- .contact(new Contact("csruan", "", ""))
- .license("Apache License Version 2.0")
- .version("1.0").build();
- }
-
- }
3. 网关中增加配置
-
- 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;
-
- @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)));
- }
-
- }
- 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;
-
- /**
- * 聚合接口文档注册
- */
- @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()))
- .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;
- }
-
- }
4. yml
- spring:
- application:
- name: gateway # 服务名称
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848 # 注册中心地址 # 默认是没有密码的
- gateway:
- discovery:
- locator:
- enabled: true #表明gateway开启服务注册和发现的功能, 动态路由
- lowerCaseServiceId: true
- filters:
- routes:
- - id: test # 唯一id ,随便起,不能重复
- uri: lb://test # 匹配注册中心的服务
- predicates:
- - Path=/test/** # 匹配的规则
- filters:
- # 去掉路由前缀,访问 localhost:8088/test/v2/api 转发的就是 localhost:8089/v2/api
- # 1 : 代表剥离路径的个数
- - StripPrefix=1
特别注意:-StripPrefix=1,这个一定不要去掉,不然你就访问不到你服务的swagger,如下图
以上步骤完成,已经在网关中集成了swagger,并可以全局添加token。
下面说明给所有单个接口添加token,swagger配置如下:
- import com.google.common.collect.Lists;
- import io.swagger.annotations.ApiOperation;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import springfox.documentation.builders.ApiInfoBuilder;
- import springfox.documentation.builders.ParameterBuilder;
- import springfox.documentation.builders.PathSelectors;
- import springfox.documentation.builders.RequestHandlerSelectors;
- import springfox.documentation.schema.ModelRef;
- import springfox.documentation.service.*;
- 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;
-
- import java.util.ArrayList;
- import java.util.List;
-
- @Configuration
- @EnableSwagger2
- public class SwaggerConfig {
- @Bean
- public Docket createRestApi() {
- return new Docket(DocumentationType.SWAGGER_2)
- .apiInfo(apiInfo())
- .select()
- .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
- .paths(PathSelectors.any())
- .build()
- .globalOperationParameters(setHeaderToken());
- }
- private ApiInfo apiInfo() {
- return new ApiInfoBuilder()
- .title("Swagger API")
- .description("test")
- .termsOfServiceUrl("")
- .contact(new Contact("wd", "", ""))
- .version("2.0")
- .build();
- }
-
- private List<ApiKey> securitySchemes() {
- List<ApiKey> apiKeyList = new ArrayList();
- apiKeyList.add(new ApiKey("token", "token", "header"));
- return apiKeyList;
- }
-
- private ApiKey apiKey() {
- return new ApiKey("token", "token", "header");
- }
-
- private List<Parameter> setHeaderToken() {
- ParameterBuilder tokenPar = new ParameterBuilder();
- List<Parameter> pars = new ArrayList<>();
- tokenPar.name("token").description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
- pars.add(tokenPar.build());
- return pars;
- }
- }
参考:
spring-boot swagger2 设置全局token,说明页面接口无法带入token https://www.cnblogs.com/webttt/p/12016135.html
SpringBoot2 配置swagger2并统一加入认证参数 https://www.jianshu.com/p/7a24d202b395
Springboot Oauth2 集成Swagger2权限验证实战 https://www.cnblogs.com/entfrm/p/12751262.html
https://gitee.com/wxdfun/sw.git
https://github.com/SpringForAll/spring-boot-starter-swagger.git
https://didispace-wx.blog.csdn.net/article/details/107438093
https://www.jianshu.com/p/aaab36790743
https://blog.csdn.net/lk1822791193/article/details/106540734
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。