当我们需要用户带着token访问我的的接口时,Swagger2通过配置统一认证可以实现全局token认证。
我们继续关注Docket里面的方法,我们需要通过下面两个方法实现全局token认证,先看代码。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
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;
/**
* TODO
*
* @author ben
* @version 1.0
* @date 2022/9/13 11:23
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
//http://127.0.0.1:8080/swagger-ui.html#/
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
//配置文档信息
.apiInfo(apiInfo())
//控制Swagger2的开启与关闭
.enable(true)
//扫描行为
.select()
//接口扫描 不匹配任何controller的接口
// .apis(RequestHandlerSelectors.none())
//扫描指定包路径 参数为 包路径的字符串
.apis(RequestHandlerSelectors.basePackage("cn.ben.for_learn_projects.swagger2config.controller"))
/// 任何请求都扫描
.paths(PathSelectors.any())
.build()
// 增加Authorization请求头
// 设置鉴权方式
.securitySchemes(securitySchemes())
//设置鉴权范围
.securityContexts(securityContexts());
}
//配置文档信息
private ApiInfo apiInfo() {
Contact contact = new Contact("ben", "https://xxxxxx.com", "Swagger2Config@SpringBoot.com");
return new ApiInfo(
"Ben的学习总结", // 标题
"Swagger2Config", // 描述
"v1.0", // 版本
"https://xxxxxx.com", // 组织链接
contact, // 联系人信息
"Apach 2.0 许可", // 许可
"https://xxxxxx.com", // 许可连接
new ArrayList<>()// 扩展
);
}
//设置鉴权策略
private List<ApiKey> securitySchemes() {
List<ApiKey> apiKeys = new ArrayList<>();
apiKeys.add(new ApiKey("yanzheng", "Authorization", "header"));
return apiKeys;
}
// 配置默认的全局鉴权策略的开关,以及通过正则表达式进行匹配;默认 ^.*$ 匹配所有URL
// *其中 securityReferences 为配置启用的鉴权策略
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$")).build());
return securityContexts;
}
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
//SecurityReference对象中的第一个参数需要和ApiKey中的name相同,实现计划和范围匹配
securityReferences.add(new SecurityReference("yanzheng", authorizationScopes));
return securityReferences;
}
}
securitySchemes()方法
我们先看到第二个方法:
该方法参数类型为一个List
,List
中的类型为继承于SecurityScheme
的一个对象,那我们看看SecurityScheme
,
发现它是一个抽象类,那我们继续看看它的实现类:
那我们知道了Swagger-ui为我们提供了三种鉴权方式,这次我要讲的是第一种,使用ApiKey
对象。
通过Api
对象的构造函数设置 API 密钥的名字(可任意取),键名,和所处位置。
//设置鉴权方式
private List<ApiKey> securitySchemes() {
List<ApiKey> apiKeys = new ArrayList<>();
apiKeys.add(new ApiKey("yanzheng", "Authorization", "header"));
return apiKeys;
}
该段代码设置鉴权方式为ApiKey,该API密钥的名字是yanzheng(验证),作用于header(请求头)的Authorization
键中。(我们知道请求头使用键值对存储信息。)
注:这里我是为了与Authorization区分开才取的yanzheng,按照约定,应当name
参数与keyname
相同,即yanzheng应当改为Authorization。
securityContexts(List securityContexts)
第二个方法是配置鉴权的作用范围,我们只需要关注这两行代码:
defaultAuth()中通过AuthorizationScope
对象的构造函数配置了作用域,在通过SecurityReference()
对象和上面的鉴权方式匹配。
forPaths() 中放入要生效的接口路径的正则表达式,如 .forPaths(PathSelectors.regex(“^(?!auth).*$”)) 表示所有带有 auth的接口路径。此处,使用 PathSelectors.any() 表示所有接口路径都生效。
当我们没有使用鉴权时,
请求头内没有鉴权信息
当我们开启鉴权后:
再次发起请求:
请求头内已经有你的token了。
至此你已经能够熟练使用Swagger2了。祝贺你!