作者簡介:大家好,我是擼代碼的羊駝,前阿里巴巴架構師,現某互聯網公司CTO
聯系v:sulny_ann(17362204968),加我進群,大家一起學習,一起進步,一起對抗互聯網寒冬
在使用swagger2時,如果api接口需要token等權限認證內容,那么此時可以有兩種方案進行解決:方案一,每個請求上面都添加對應token的key和value值。方案二:全局統一添加權限認證的token。
一般情況下token都存放在header中。
引入swagger2依賴
引入對應的swagger2依賴:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
集成配置方案一
首先我們來看第一種方案,也就是每個請求都添加對應header信息,對應的config文件配置如下:???????
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiOperation;
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.Collections;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
ParameterBuilder parameterBuilder = new ParameterBuilder();
List<Parameter> parameters = Lists.newArrayList();
parameterBuilder
.name("token")
.description("token令牌")
.modelRef(new ModelRef("String"))
.parameterType("header")
.defaultValue("")
.required(false).build();
parameters.add(parameterBuilder.build());
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//加了ApiOperation注解的類,才生成接口文檔
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//包下的類,才生成接口文檔
.apis(RequestHandlerSelectors.basePackage("com.chengdeshi.controller"))
.paths(PathSelectors.any())
.build()
.globalOperationParameters(parameters)
.securitySchemes(security());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("文檔")
.description("文檔")
.termsOfServiceUrl("https://www.choupangxia.com")
.version("4.0.0")
.build();
}
private List<ApiKey> security() {
return newArrayList(
new ApiKey("token", "token", "header")
);
}
}
重點是構建了ParameterBuilder對象,并通過globalOperationParameters將其配置到Docket中。
此時展示效果如下:?
執行每個接口請求時都需要添加token值,除非寫死默認值。
集成配置方案二
如果不想每次都填寫這么一個token字段,每次都手動進行填寫。那么可以通過統一全局配置。
對應的配置文件配置如下:???????
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//加了ApiOperation注解的類,才生成接口文檔
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//包下的類,才生成接口文檔
.apis(RequestHandlerSelectors.basePackage("com.chengdeshi.controller"))
.paths(PathSelectors.any())
.build()
.securityContexts(securityContexts())
.securitySchemes(security());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("文檔")
.description("文檔")
.termsOfServiceUrl("https://www.choupangxia.com")
.version("4.0.0")
.build();
}
private List<ApiKey> security() {
return newArrayList(
new ApiKey("token", "token", "header")
);
}
private List<SecurityContext> securityContexts() {
return new ArrayList(
Collections.singleton(SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!api).*$"))
.build())
);
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return new ArrayList(
Collections.singleton(new SecurityReference("token", authorizationScopes)));
}
}
此時重點是配置了Docket的securityContexts,通過該配置,設置了一個全局的變量“global”。注意defaultAuth方法中SecurityReference的第一個參數為你使用的token的key,我這里使用token。
此種方案展示效果如下:
在右上角會出現一個Authorize的選項。?
點擊“Authorize”,彈出下圖。?
在圖中value的地方填寫對應的token值,點擊個Authorize。隨后使用任何接口時都會在header部分添加對應token值。
???????小結
當然上述是以token為例進行講解的,如果你想通過header傳輸其他參數,也可以借鑒此方法。在此實例中大家切勿全部copy,在具體場景下需要修改對應的參數值來進行使用。