作者:OHJ小白
这篇文章是基于swagger的基础上整合SpringSecurity,希望这篇文章可以帮助大家使用swagger时整合SpringSecurity
Springboot整合swagger(knife4j3.0.3)(一):(11条消息) Springboot整合swagger(knife4j3.0.3)(一)_OHJ小白的博客-CSDN博客
目录
前言
在项目完成swagger的基础搭建后,若项目中使用了SpringSecurity,一般都是使用token去实现用户登录,所以我们在使用接口文档时,我们每次都需要在请求头上携带token去请求项目中的接口,我们开发人员使用swagger时多了很多不必要的步骤,这时候我们应该在swagger里面配置全局统一请求头信息,可以省去这些不必要步骤,除此之外,若项目中使用了SpringSecurity,还会出现访问不到接口文档页面等
提示:以下是本篇文章正文内容,下面案例可供参考
一、配置swagger请求头信息
swagger配置文件代码如下:
package com.example.server.web.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import io.swagger.models.auth.In;
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.*;
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;
/**
* swagger配置
*/
@Configuration
@EnableSwagger2
@EnableKnife4j
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.useDefaultResponseMessages(false)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.server.web.controller"))
.paths(PathSelectors.any())
.build()
.securityContexts(securityContexts())
.securitySchemes(securitySchemes());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.description("学生评测系统在线API接口文档")
.contact(new Contact("YHJ","#", "2733247927@qq.com"))
.version("v3.0.0")
.title("学生评测系统在线API接口文档")
.build();
}
/**
* 安全模式,这里指定token通过Authorization头请求头传递
*/
private List<SecurityScheme> securitySchemes() {
// 设置请求头信息
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
return apiKeyList;
}
/**
* 安全上下文
*/
private List<SecurityContext> securityContexts() {
// 设置需要登录的认证路径
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.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<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
}
二、使用步骤
打开接口文档首页
http://localhost:8081/doc.html
这时候发现接口文档左侧导航栏多了一个Authorize选项
红色框就是填写认证请求头信息,只要将你的token写进去,那么每次请求都会携带这个token去请求了,不用每次发请求的时候,都需要在请求头上手写token
三、注意
若项目添加了SpringSecurity后导致不能访问接口文档页面,这很大可能是因为接口文档页面的url被SpringSecurity拦截了,所以导致访问不了,所以我们需要在SpringSecurity中将有关的url进行放行
"/webjars/**"
"/swagger-resources/**"
"/*/api-docs/**"
"/swagger-ui.html"