/* * Copyright 2019-2020 Zheng Jie * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package me.zhengjie.config; import cn.hutool.core.collection.CollUtil; import com.fasterxml.classmate.TypeResolver; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.data.domain.Pageable; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.schema.AlternateTypeRule; import springfox.documentation.schema.AlternateTypeRuleConvention; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiKey; import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.SecurityReference; import springfox.documentation.service.SecurityScheme; 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; import static springfox.documentation.schema.AlternateTypeRules.newRule; /** * api页面 /doc.html * @author Zheng Jie * @date 2018-11-23 */ @Configuration @EnableSwagger2 public class SwaggerConfig { @Value("${jwt.header}") private String tokenHeader; @Value("${swagger.enabled}") private Boolean enabled; @Bean @SuppressWarnings("all") public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .enable(enabled) .pathMapping("/") .apiInfo(apiInfo()) .select() .paths(PathSelectors.regex("^(?!/error).*")) .paths(PathSelectors.any()) .build() //添加登陆认证 .securitySchemes(securitySchemes()) .securityContexts(securityContexts()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .description("一个简单且易上手的 Spring boot 后台管理框架") .title("EL-ADMIN 接口文档") .version("2.6") .build(); } private List securitySchemes() { //设置请求头信息 List securitySchemes = new ArrayList<>(); ApiKey apiKey = new ApiKey(tokenHeader, tokenHeader, "header"); securitySchemes.add(apiKey); return securitySchemes; } private List securityContexts() { //设置需要登录认证的路径 List securityContexts = new ArrayList<>(); // ^(?!auth).*$ 表示所有包含auth的接口不需要使用securitySchemes即不需要带token // ^标识开始 ()里是一子表达式 ?!/auth表示匹配不是/auth的位置,匹配上则添加请求头,注意路径已/开头 .表示任意字符 *表示前面的字符匹配多次 $标识结束 securityContexts.add(getContextByPath()); return securityContexts; } private SecurityContext getContextByPath() { return SecurityContext.builder() .securityReferences(defaultAuth()) .operationSelector(o->o.requestMappingPattern().matches("^(?!/auth).*$")) .build(); } private List defaultAuth() { List securityReferences = new ArrayList<>(); AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; securityReferences.add(new SecurityReference(tokenHeader, authorizationScopes)); return securityReferences; } } /** * 将Pageable转换展示在swagger中 */ @Configuration class SwaggerDataConfig { @Bean public AlternateTypeRuleConvention pageableConvention(final TypeResolver resolver) { return new AlternateTypeRuleConvention() { @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } @Override public List rules() { return CollUtil.newArrayList(newRule(resolver.resolve(Pageable.class), resolver.resolve(Page.class))); } }; } @ApiModel @Data private static class Page { @ApiModelProperty("页码 (0..N)") private Integer page; @ApiModelProperty("每页显示的数目") private Integer size; @ApiModelProperty("以下列格式排序标准:property[,asc | desc]。 默认排序顺序为升序。 支持多种排序条件:如:id,asc") private List sort; } }