package cn.stylefeng.rest.config; import cn.hutool.core.collection.CollUtil; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; 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.annotations.ApiIgnore; 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 javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.List; import static com.google.common.collect.Lists.newArrayList; @Configuration @EnableSwagger2 @EnableKnife4j @ConditionalOnProperty(prefix = "guns", name = "swagger-open", havingValue = "true") public class SwaggerConfig { /** * Swagger忽略的参数类型 */ private final Class[] ignoredParameterTypes = new Class[]{ ServletRequest.class, ServletResponse.class, HttpServletRequest.class, HttpServletResponse.class, HttpSession.class, ApiIgnore.class }; @Bean public Docket api() { // // 添加header参数 // ParameterBuilder ticketPar = new ParameterBuilder(); // List pars = new ArrayList<>(); // ticketPar.name("Authorization") // .defaultValue("user token") // .modelRef(new ModelRef("string")) // .parameterType("header") // .required(false).build(); // pars.add(ticketPar.build()); return new Docket(DocumentationType.SWAGGER_2). useDefaultResponseMessages(false) .apiInfo(apiInfo()) .select() // 这里采用包含注解的方式来确定要显示的接口 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.regex("^(?!auth).*$")) .build() //.globalOperationParameters(pars) .securitySchemes(securitySchemes()) .securityContexts(securityContexts()); } @Bean(value = "publicApi") public Docket publicApi() { String groupName = "公共接口"; return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .groupName(groupName) .select() .paths(PathSelectors.ant("/public/**")) .apis(RequestHandlerSelectors.basePackage("cn.stylefeng")) .build().ignoredParameterTypes(ignoredParameterTypes); } @Bean(value = "workerApi") public Docket driverApi() { String groupName = "工作人员接口"; return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .groupName(groupName) .select() .apis(RequestHandlerSelectors.basePackage("cn.stylefeng")) .paths(PathSelectors.ant("/worker/**")) .build().ignoredParameterTypes(ignoredParameterTypes) .securitySchemes(CollUtil.newArrayList(new ApiKey("Authorization", "Authorization", "header"))) .securityContexts(securityContexts()); } private List securitySchemes() { return newArrayList( new ApiKey("Authorization", "Authorization", "header")); } private List securityContexts() { return newArrayList( SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.regex("/.*")) .build() ); } List defaultAuth() { AuthorizationScope[] authorizationScopes = new AuthorizationScope[]{new AuthorizationScope("global", "accessEverything")}; return newArrayList( new SecurityReference("Authorization", authorizationScopes)); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Api接口") // .description("Api文档") // .termsOfServiceUrl("http://www.rest.com/") .version("1.0") .build(); } }