package cn.exrick.xboot.config.swagger; import cn.exrick.xboot.core.config.properties.IgnoredUrlsProperties; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; 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.EnableSwagger2WebMvc; import java.util.Collections; import java.util.List; import java.util.function.Predicate; import static springfox.documentation.builders.PathSelectors.ant; import static springfox.documentation.builders.PathSelectors.regex; /** * @author Exrickx */ @Slf4j @Configuration @EnableSwagger2WebMvc public class Swagger2Config { @Value("${swagger.title:XBoot}") private String title; @Value("${swagger.description:Api Documentation}") private String description; @Value("${swagger.version:1.0}") private String version; @Value("${swagger.termsOfServiceUrl:http://xboot.exrick.cn}") private String termsOfServiceUrl; @Value("${swagger.group:XBoot v1.0}") private String group; @Value("${swagger.group2:XBoot2 v1.0}") private String group2; @Value("${swagger.contact.name:Exrick}") private String name; @Value("${swagger.contact.url:http://exrick.cn}") private String url; @Value("${swagger.contact.email:1012139570@qq.com}") private String email; @Autowired private IgnoredUrlsProperties ignoredUrlsProperties; public List securityContexts() { Predicate paths = ant(""); for (String url : ignoredUrlsProperties.getUrls()) { paths = paths.or(ant(url)); } return Collections.singletonList( SecurityContext.builder() .securityReferences(Collections.singletonList( new SecurityReference("Authorization", new AuthorizationScope[]{ new AuthorizationScope("global", "")}))) .forPaths(paths.negate()) .build()); } @Bean public Docket createRestApi() { List securitySchemes = Collections.singletonList( new ApiKey("Authorization", "accessToken", "header")); return new Docket(DocumentationType.SWAGGER_2) .groupName(group) .apiInfo(apiInfo()).select() // 扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(regex(".*/app/.*").negate()) .build() .securitySchemes(securitySchemes) .securityContexts(securityContexts()); } @Bean public Docket createAppRestApi() { List securitySchemes = Collections.singletonList( new ApiKey("Authorization", "appToken", "header")); return new Docket(DocumentationType.SWAGGER_2) .groupName(group2) .apiInfo(apiInfo()).select() // 扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(regex(".*/app/.*")) .build() .securitySchemes(securitySchemes) .securityContexts(securityContexts()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title(title) .description(description) .termsOfServiceUrl(termsOfServiceUrl) .contact(new Contact(name, url, email)) .version(version) .build(); } }