mirror of https://github.com/elunez/eladmin
153 lines
5.5 KiB
Java
153 lines
5.5 KiB
Java
/*
|
||
* 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<SecurityScheme> securitySchemes() {
|
||
//设置请求头信息
|
||
List<SecurityScheme> securitySchemes = new ArrayList<>();
|
||
ApiKey apiKey = new ApiKey(tokenHeader, tokenHeader, "header");
|
||
securitySchemes.add(apiKey);
|
||
return securitySchemes;
|
||
}
|
||
|
||
private List<SecurityContext> securityContexts() {
|
||
//设置需要登录认证的路径
|
||
List<SecurityContext> 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<SecurityReference> defaultAuth() {
|
||
List<SecurityReference> 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<AlternateTypeRule> 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<String> sort;
|
||
}
|
||
}
|