1. 程式人生 > >Swagger2 非全域性、無需重複輸入的Head引數(Token)配置

Swagger2 非全域性、無需重複輸入的Head引數(Token)配置

網路上關於Swagger2的教程多如牛毛,作為關於Swagger加入全域性head引數(如token)的文章也很多。例如:

但上述方案存在2個不足之處:

  1. 需要在每個介面下單獨輸入引數
  2. 全域性配置了引數,如果某些介面(如login等)不需要引數,則必須在改介面中通過annotation現實宣告,較為麻煩

綜上,選擇優化方案如下:

1.通過Swagger2的securitySchemes配置全域性引數:如下列程式碼所示,securitySchemes的ApiKey中增加一個名為“Authorization”,type為“header”的引數。

1234private List<ApiKey> securitySchemes
()
{ return newArrayList( new ApiKey("Authorization", "Authorization", "header")); }

2.在Swagger2的securityContexts中通過正則表示式,設定需要使用引數的介面(或者說,是去除掉不需要使用引數的介面),如下列程式碼所示,通過PathSelectors.regex(“^(?!auth).*$”),所有包含”auth”的介面不需要使用securitySchemes。即不需要使用上文中設定的名為“Authorization”,type為“header”的引數。

12345678private List<SecurityContext> securityContexts() { return newArrayList( SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.regex("^(?!auth).*$")) .build() ); }

設定完成後進入SwaggerUI,右上角出現“Authorization”按鈕,點選即可輸入我們配置的引數。
對於不需要輸入引數的介面(上文所述的包含auth的介面),在未輸入Authorization引數就可以訪問。
其他介面則將返回401錯誤。點選右上角“Authorization”按鈕,輸入配置的引數後即可訪問。引數輸入後全域性有效,無需每個介面單獨輸入。
image.png
至此,完成Swagger2 非全域性、無需重複輸入的Head引數配置。
Swagger2的相關完整程式碼如下(工程基於Springboot):

1234567891011121314151617181920212223242526272829303132333435363738@Configuration@EnableSwagger2public class Swagger { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2). useDefaultResponseMessages(false) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.regex("^(?!auth).*$")) .build() .securitySchemes(securitySchemes()) .securityContexts(securityContexts()) ; } private List<ApiKey> securitySchemes() { return newArrayList( new ApiKey("Authorization", "Authorization", "header")); } private List<SecurityContext> securityContexts() { return newArrayList( SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.regex("^(?!auth).*$")) .build() ); } List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return newArrayList( new SecurityReference("Authorization", authorizationScopes)); }}

轉載自:

http://fish119.site/2018/01/04/Swagger2-%E9%9D%9E%E5%85%A8%E5%B1%80Header%E5%8F%82%E6%95%B0%EF%BC%88Token%EF%BC%89%E9%85%8D%E7%BD%AE/