package com.qianwen.core.swagger; import com.fasterxml.classmate.TypeResolver; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; import com.google.common.collect.Lists; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.qianwen.core.launch.props.BladeProperties; import com.qianwen.core.secure.BladeUser; import com.qianwen.core.swagger.SwaggerProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.schema.AlternateTypeRule; import springfox.documentation.schema.AlternateTypeRules; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiKey; import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.Contact; 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.ApiSelectorBuilder; import springfox.documentation.spring.web.plugins.Docket; @EnableSwagger @Configuration(proxyBeanMethods = false) @Import({BeanValidatorPluginsConfiguration.class}) /* loaded from: blade-starter-swagger-9.3.0.0-SNAPSHOT.jar:org/springblade/core/swagger/SwaggerAutoConfiguration.class */ public class SwaggerAutoConfiguration { private static final String DEFAULT_BASE_PATH = "/**"; private static final List DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**"); private final OpenApiExtensionResolver openApiExtensionResolver; private final BladeProperties bladeProperties; public SwaggerAutoConfiguration(final OpenApiExtensionResolver openApiExtensionResolver, final BladeProperties bladeProperties) { this.openApiExtensionResolver = openApiExtensionResolver; this.bladeProperties = bladeProperties; } @ConditionalOnMissingBean @Bean public SwaggerProperties swaggerProperties() { return new SwaggerProperties(); } @ConditionalOnMissingBean @Bean public Docket api(SwaggerProperties swaggerProperties) { if (swaggerProperties.getBasePath().size() == 0) { swaggerProperties.getBasePath().add(DEFAULT_BASE_PATH); } if (swaggerProperties.getExcludePath().size() == 0) { swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH); } TypeResolver resolver = new TypeResolver(); AlternateTypeRule listLongToString = AlternateTypeRules.newRule(resolver.resolve(List.class, new Type[]{Long.class}), resolver.resolve(List.class, new Type[]{String.class})); ApiSelectorBuilder apis = new Docket(DocumentationType.SWAGGER_2).host(swaggerProperties.getHost()).apiInfo(apiInfo(swaggerProperties)).ignoredParameterTypes(new Class[]{BladeUser.class}).alternateTypeRules(new AlternateTypeRule[]{listLongToString}).directModelSubstitute(Long.class, String.class).directModelSubstitute(Long.TYPE, String.class).select().apis(SwaggerUtil.basePackages(swaggerProperties.getBasePackages())); swaggerProperties.getBasePath().forEach(p -> { apis.paths(PathSelectors.ant(p)); }); swaggerProperties.getExcludePath().forEach(p2 -> { apis.paths(PathSelectors.ant(p2).negate()); }); return apis.build().securityContexts(securityContexts(swaggerProperties)).securitySchemes(securitySchemas(swaggerProperties)).extensions(this.openApiExtensionResolver.buildExtensions(this.bladeProperties.getName())).pathMapping("/").forCodeGeneration(true); } private List securityContexts(SwaggerProperties swaggerProperties) { return Collections.singletonList(SecurityContext.builder().securityReferences(defaultAuth(swaggerProperties)).forPaths(PathSelectors.regex(swaggerProperties.getAuthorization().getAuthRegex())).build()); } private List defaultAuth(SwaggerProperties swaggerProperties) { List authorizationScopeList = new ArrayList<>(); List securityReferenceList = new ArrayList<>(); List swaggerScopeList = swaggerProperties.getAuthorization().getAuthorizationScopeList(); swaggerScopeList.forEach(authorizationScope -> { authorizationScopeList.add(new AuthorizationScope(authorizationScope.getScope(), authorizationScope.getDescription())); }); if (authorizationScopeList.size() == 0) { authorizationScopeList.add(new AuthorizationScope("global", "accessEverywhere")); } AuthorizationScope[] authorizationScopes = (AuthorizationScope[]) authorizationScopeList.toArray(new AuthorizationScope[0]); swaggerScopeList.forEach(authorizationScope2 -> { securityReferenceList.add(new SecurityReference(authorizationScope2.getName(), authorizationScopes)); }); if (securityReferenceList.size() == 0) { securityReferenceList.add(new SecurityReference(SwaggerUtil.clientInfo().getName(), authorizationScopes)); securityReferenceList.add(new SecurityReference(SwaggerUtil.bladeAuth().getName(), authorizationScopes)); securityReferenceList.add(new SecurityReference(SwaggerUtil.bladeTenant().getName(), authorizationScopes)); } return securityReferenceList; } private List securitySchemas(SwaggerProperties swaggerProperties) { List swaggerApiKeyList = swaggerProperties.getAuthorization().getAuthorizationApiKeyList(); if (swaggerApiKeyList.size() == 0) { return Lists.newArrayList(new SecurityScheme[]{SwaggerUtil.clientInfo(), SwaggerUtil.bladeAuth(), SwaggerUtil.bladeTenant()}); } List securitySchemeList = new ArrayList<>(); swaggerApiKeyList.forEach(authorizationApiKey -> { securitySchemeList.add(new ApiKey(authorizationApiKey.getName(), authorizationApiKey.getKeyName(), authorizationApiKey.getPassAs())); }); return securitySchemeList; } private ApiInfo apiInfo(SwaggerProperties swaggerProperties) { return new ApiInfoBuilder().title(swaggerProperties.getTitle()).description(swaggerProperties.getDescription()).license(swaggerProperties.getLicense()).licenseUrl(swaggerProperties.getLicenseUrl()).termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl()).contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail())).version(swaggerProperties.getVersion()).build(); } }