All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.iiifi.kite.boot.configuration.KiteSwaggerAutoConfiguration Maven / Gradle / Ivy

There is a newer version: 1.2.4.RELEASE
Show newest version
/*
 * Copyright 2019-2025 the original author or authors.
 * 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
 * https://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 com.iiifi.kite.boot.configuration;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.iiifi.kite.boot.properties.KiteSwaggerProperties;
import com.iiifi.kite.configuration.KiteHeader;
import com.iiifi.kite.configuration.KiteProperties;

import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.RequestParameterBuilder;
import springfox.documentation.schema.ScalarType;
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.swagger.web.ApiKeyVehicle;

/**
 * Swagger3配置
 *
 * @author [email protected] 花朝
 */
@Configuration
@RequiredArgsConstructor
@ConditionalOnClass(Docket.class)
@AutoConfigureAfter(KiteSwaggerProperties.class)
@ConditionalOnMissingClass("org.springframework.cloud.gateway.configuration.GatewayAutoConfiguration")
public class KiteSwaggerAutoConfiguration {

    private final KiteProperties kiteProperties;

    private final KiteSwaggerProperties swaggerProperties;

    @Bean
    public Docket createRestApi() {
        // 组名为应用名
        String appName = kiteProperties.getName();
        Docket docket = new Docket(DocumentationType.OAS_30).enable(swaggerProperties.isEnabled())
                .useDefaultResponseMessages(false).globalRequestParameters(globalHeaders())
                .apiInfo(apiInfo(appName)).select().apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .paths(PathSelectors.any())
                .build();
        // 如果开启认证
        if (swaggerProperties.getAuthorization().getEnabled()) {
            docket.securitySchemes(Collections.singletonList(apiKey()));
            docket.securityContexts(Collections.singletonList(securityContext()));
        }
        return docket;
    }

    /**
     * 配置基于 ApiKey 的鉴权对象
     *
     * @return {ApiKey}
     */
    private ApiKey apiKey() {
        return new ApiKey(swaggerProperties.getAuthorization().getName(),
                swaggerProperties.getAuthorization().getKeyName(), ApiKeyVehicle.HEADER.getValue());
    }

    /**
     * 配置默认的全局鉴权策略的开关,以及通过正则表达式进行匹配;默认 ^.*$ 匹配所有URL 其中 securityReferences 为配置启用的鉴权策略
     *
     * @return {SecurityContext}
     */
    private SecurityContext securityContext() {
        return SecurityContext.builder().securityReferences(defaultAuth())
                .operationSelector(o -> PathSelectors.regex(swaggerProperties.getAuthorization().getAuthRegex())
                        .test(o.requestMappingPattern()))
                .build();
    }

    /**
     * 配置默认的全局鉴权策略;其中返回的 SecurityReference 中,reference
     * 即为ApiKey对象里面的name,保持一致才能开启全局鉴权
     *
     * @return {List}
     */
    private List defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Collections.singletonList(SecurityReference.builder()
                .reference(swaggerProperties.getAuthorization().getName()).scopes(authorizationScopes).build());
    }

    private ApiInfo apiInfo(String appName) {
        String defaultName = appName + " 服务";
        String title = Optional.ofNullable(swaggerProperties.getTitle()).orElse(defaultName);
        String description = Optional.ofNullable(swaggerProperties.getDescription()).orElse(defaultName);
        return new ApiInfoBuilder().title(title).description(description).version(swaggerProperties.getVersion())
                .contact(new Contact(swaggerProperties.getContactUser(), swaggerProperties.getContactUrl(),
                        swaggerProperties.getContactEmail()))
                .build();
    }

    private List globalHeaders() {
        List pars = new ArrayList<>();
        getHeaders().forEach(header -> {
            RequestParameter parameter = new RequestParameterBuilder().name(header.getName())
                    .description(header.getDescription()).in(ParameterType.HEADER)
                    .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))).required(header.isRequired()).build();
            pars.add(parameter);
        });
        return pars;
    }

    /**
     * 设置默认header
     *
     * @return headers
     */
    private List getHeaders() {
        List headers = swaggerProperties.getHeaders();
        KiteSwaggerProperties.Header tokenHeader = new KiteSwaggerProperties.Header();
        tokenHeader.setName(KiteHeader.X_TOKEN);
        headers.add(tokenHeader);
        KiteSwaggerProperties.Header deviceHeader = new KiteSwaggerProperties.Header();
        deviceHeader.setName(KiteHeader.X_DEVICE_ID);
        headers.add(deviceHeader);
        KiteSwaggerProperties.Header dynamicHeader = new KiteSwaggerProperties.Header();
        dynamicHeader.setName(KiteHeader.X_DYNAMIC_ID);
        headers.add(dynamicHeader);
        KiteSwaggerProperties.Header routeHeader = new KiteSwaggerProperties.Header();
        routeHeader.setName(KiteHeader.X_ROUTE_KEY);
        headers.add(routeHeader);
        return headers;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy