From 1799facc1c302b501a7571f8c669abe56c6cf487 Mon Sep 17 00:00:00 2001 From: edgar <373337002@qq.com> Date: Wed, 18 May 2022 09:51:23 +0800 Subject: [PATCH] =?UTF-8?q?swagger=20=E5=BC=80=E5=90=AFbasic=20=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/config/GatewayConfiguration.java | 8 ++ .../config/SpringDocConfiguration.java | 16 +-- .../pig/gateway/config/SwaggerProperties.java | 118 ++++++++++++++++++ .../filter/SwaggerBasicGatewayFilter.java | 76 +++++++++++ 4 files changed, 204 insertions(+), 14 deletions(-) create mode 100644 pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SwaggerProperties.java create mode 100644 pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java index ceaaeed7..203e6a3a 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java @@ -3,9 +3,11 @@ package com.pig4cloud.pig.gateway.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pig.gateway.filter.PasswordDecoderFilter; import com.pig4cloud.pig.gateway.filter.PigRequestGlobalFilter; +import com.pig4cloud.pig.gateway.filter.SwaggerBasicGatewayFilter; import com.pig4cloud.pig.gateway.filter.ValidateCodeGatewayFilter; import com.pig4cloud.pig.gateway.handler.GlobalExceptionHandler; import com.pig4cloud.pig.gateway.handler.ImageCodeHandler; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,6 +32,12 @@ public class GatewayConfiguration { return new PigRequestGlobalFilter(); } + @Bean + @ConditionalOnProperty(name = "swagger.basic.enable") + public SwaggerBasicGatewayFilter swaggerBasicGatewayFilter(SwaggerProperties swaggerProperties){ + return new SwaggerBasicGatewayFilter(swaggerProperties); + } + @Bean public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties, ObjectMapper objectMapper, RedisTemplate redisTemplate) { diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java index 31ff2fe0..7c4a93c4 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java @@ -1,18 +1,14 @@ package com.pig4cloud.pig.gateway.config; -import lombok.Data; import org.springdoc.core.GroupedOpenApi; import org.springdoc.core.SwaggerUiConfigParameters; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * @author lengleng @@ -27,21 +23,13 @@ public class SpringDocConfiguration { @Lazy(false) @ConditionalOnProperty(name = "springdoc.api-docs.enabled", matchIfMissing = true) public List apis(SwaggerUiConfigParameters swaggerUiConfigParameters, - SwaggerProperties properties) { + SwaggerProperties swaggerProperties) { List groups = new ArrayList<>(); - for (String value : properties.services.values()) { + for (String value : swaggerProperties.getServices().values()) { swaggerUiConfigParameters.addGroup(value); } return groups; } - @Data - @Component - @ConfigurationProperties("swagger") - class SwaggerProperties { - - private Map services; - - } } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SwaggerProperties.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SwaggerProperties.java new file mode 100644 index 00000000..fce68044 --- /dev/null +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SwaggerProperties.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pig.gateway.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * SwaggerProperties + * + * swagger: + * basic: + * enable: true + * username: admin + * password: admin + * + * @author edgar + */ +@Data +@Component +@ConfigurationProperties("swagger") +public class SwaggerProperties { + + /** + * 是否开启swagger + */ + private Boolean enabled = true; + + /** + * swagger会解析的包路径 + **/ + private String basePackage = ""; + + /** + * swagger会解析的url规则 + **/ + private List basePath = new ArrayList<>(); + + /** + * 在basePath基础上需要排除的url规则 + **/ + private List excludePath = new ArrayList<>(); + + /** + * 需要排除的服务 + */ + private List ignoreProviders = new ArrayList<>(); + + /** + * 标题 + **/ + private String title = ""; + + /** + * 网关 + */ + private String gateway; + + /** + * 获取token + */ + private String tokenUrl; + + /** + * 作用域 + */ + private String scope; + + private Map services; + + /** + * 认证参数 + */ + private SwaggerBasic basic = new SwaggerBasic(); + + + + @Data + public static class SwaggerBasic { + + /** + * 是否开启 basic 认证 + */ + private Boolean enabled; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + } + + +} diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java new file mode 100644 index 00000000..76aeef59 --- /dev/null +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java @@ -0,0 +1,76 @@ +package com.pig4cloud.pig.gateway.filter; + +import com.pig4cloud.pig.gateway.config.SwaggerProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.util.Base64Utils; +import org.springframework.util.StringUtils; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; + +/** + * swagger 开启basic 认证 + * + * @author edgar + * @date 2022/5/8 + */ +@Slf4j +@RequiredArgsConstructor +public class SwaggerBasicGatewayFilter implements GlobalFilter { + + private static final String API_URI = "/v3/api-docs"; + + private static final String BASIC_PREFIX = "Basic "; + + private final SwaggerProperties swaggerProperties; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + + if (!request.getURI().getPath().contains(API_URI)) { + return chain.filter(exchange); + } + + if (hasAuth(exchange)) { + return chain.filter(exchange); + } + else { + ServerHttpResponse response = exchange.getResponse(); + response.setStatusCode(HttpStatus.UNAUTHORIZED); + response.getHeaders().add(HttpHeaders.WWW_AUTHENTICATE, "Basic Realm=\"pig\""); + return response.setComplete(); + } + } + + /** + * 简单的basic认证 + * @param exchange 上下文 + * @return 是否有权限 + */ + private boolean hasAuth(ServerWebExchange exchange) { + ServerHttpRequest request = exchange.getRequest(); + String auth = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + log.info("Basic认证信息为:{}", auth); + if (!StringUtils.hasText(auth) || !auth.startsWith(BASIC_PREFIX)) { + return Boolean.FALSE; + } + + String username = swaggerProperties.getBasic().getUsername(); + String password = swaggerProperties.getBasic().getPassword(); + + String encodeToString = Base64Utils + .encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8)); + + return auth.equals(BASIC_PREFIX + encodeToString); + } + +} -- GitLab