BF-202308171519\Administrator 2 лет назад
Родитель
Сommit
e1db63f393

+ 1 - 1
kxs-codegen/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 server:
-  port: 5002
+  port: 4002
 
 # 配置文件加密根密码
 jasypt:

+ 4 - 0
kxs-common/kxs-common-security/pom.xml

@@ -48,6 +48,10 @@
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjweaver</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
         <!-- log -->
         <dependency>
             <groupId>com.kxs</groupId>

+ 2 - 2
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java

@@ -36,7 +36,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationConverter<T extends O
 	 * 校验参数
 	 * @param request 请求
 	 */
-	public void checkParams(HttpServletRequest request) {
+	public void checkParams(MultiValueMap<String, String> request) {
 
 	}
 
@@ -73,7 +73,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationConverter<T extends O
 		}
 
 		// 校验个性化参数
-		checkParams(request);
+		checkParams(parameters);
 
 		// 获取当前已经认证的客户端信息
 		Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication();

+ 3 - 4
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/password/OAuth2ResourceOwnerPasswordAuthenticationConverter.java

@@ -2,7 +2,6 @@ package com.kxs.common.security.support.password;
 
 import com.kxs.common.security.support.base.OAuth2ResourceOwnerBaseAuthenticationConverter;
 import com.kxs.common.security.util.OAuth2EndpointUtils;
-import jakarta.servlet.http.HttpServletRequest;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.oauth2.core.AuthorizationGrantType;
 import org.springframework.security.oauth2.core.OAuth2ErrorCodes;
@@ -40,11 +39,11 @@ public class OAuth2ResourceOwnerPasswordAuthenticationConverter
 
 	/**
 	 * 校验扩展参数 密码模式密码必须不为空
-	 * @param request 参数列表
+	 * @param parameters 参数列表
 	 */
 	@Override
-	public void checkParams(HttpServletRequest request) {
-		MultiValueMap<String, String> parameters = OAuth2EndpointUtils.getParameters(request);
+	public void checkParams(MultiValueMap<String, String> parameters) {
+//		MultiValueMap<String, String> parameters = OAuth2EndpointUtils.getParameters(request);
 		// username (REQUIRED)
 		String username = parameters.getFirst(OAuth2ParameterNames.USERNAME);
 		if (!StringUtils.hasText(username) || parameters.get(OAuth2ParameterNames.USERNAME).size() != 1) {

+ 3 - 4
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/sms/OAuth2ResourceOwnerSmsAuthenticationConverter.java

@@ -3,7 +3,6 @@ package com.kxs.common.security.support.sms;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.security.support.base.OAuth2ResourceOwnerBaseAuthenticationConverter;
 import com.kxs.common.security.util.OAuth2EndpointUtils;
-import jakarta.servlet.http.HttpServletRequest;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.oauth2.core.AuthorizationGrantType;
 import org.springframework.security.oauth2.core.OAuth2ErrorCodes;
@@ -41,11 +40,11 @@ public class OAuth2ResourceOwnerSmsAuthenticationConverter
 
 	/**
 	 * 校验扩展参数 密码模式密码必须不为空
-	 * @param request 参数列表
+	 * @param parameters 参数列表
 	 */
 	@Override
-	public void checkParams(HttpServletRequest request) {
-		MultiValueMap<String, String> parameters = OAuth2EndpointUtils.getParameters(request);
+	public void checkParams(MultiValueMap<String, String> parameters) {
+//		MultiValueMap<String, String> parameters = OAuth2EndpointUtils.getParameters(request);
 		// PHONE (REQUIRED)
 		String phone = parameters.getFirst(SecurityConstants.SMS_PARAMETER_NAME);
 		if (!StringUtils.hasText(phone) || parameters.get(SecurityConstants.SMS_PARAMETER_NAME).size() != 1) {

+ 56 - 9
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/util/OAuth2EndpointUtils.java

@@ -1,18 +1,25 @@
 package com.kxs.common.security.util;
 
 import cn.hutool.core.map.MapUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.experimental.UtilityClass;
-import org.springframework.security.oauth2.core.*;
+import org.springframework.security.oauth2.core.OAuth2AccessToken;
+import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
+import org.springframework.security.oauth2.core.OAuth2Error;
+import org.springframework.security.oauth2.core.OAuth2RefreshToken;
 import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
-import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
-import org.springframework.security.oauth2.core.endpoint.PkceParameterNames;
 import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
+import org.springframework.util.StreamUtils;
 
-import java.io.IOException;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
 import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -27,20 +34,60 @@ public class OAuth2EndpointUtils {
 	public final String ACCESS_TOKEN_REQUEST_ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2";
 
 	public MultiValueMap<String, String> getParameters(HttpServletRequest request) {
+
+		String bodyString = getBodyString(request);
+		JSONObject jsonObject = JSON.parseObject(bodyString);
+
 		Map<String, String[]> parameterMap = request.getParameterMap();
 		MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(parameterMap.size());
 		parameterMap.forEach((key, values) -> {
-			if (values.length > 0) {
-				for (String value : values) {
-					parameters.add(key, value);
-				}
+			for (String value : values) {
+				parameters.add(key, value);
 			}
 		});
+		if(jsonObject != null && !jsonObject.isEmpty()){
+			for(Object key:jsonObject.keySet()){
+				String value = jsonObject.get(key).toString();
+				parameters.add(key.toString(), value);
+			}
+		}
+
 		return parameters;
 	}
+	private String getBodyString(HttpServletRequest request) {
+		StringBuilder sb = new StringBuilder();
+		InputStream inputStream = null;
+		BufferedReader reader = null;
+		try {
+			inputStream = request.getInputStream();
+			reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
+			String line = "";
+			while ((line = reader.readLine()) != null) {
+				sb.append(line);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (inputStream != null) {
+				try {
+					inputStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (reader != null) {
+				try {
+					reader.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return sb.toString();
+	}
 
 	public void throwError(String errorCode, String parameterName, String errorUri) {
-		OAuth2Error error = new OAuth2Error(errorCode, "OAuth 2.0 Parameter: " + parameterName, errorUri);
+		OAuth2Error error = new OAuth2Error(errorCode, "OAuth 2.0 参数错误: " + parameterName, errorUri);
 		throw new OAuth2AuthenticationException(error);
 	}
 

+ 1 - 1
kxs-gateway/src/main/java/com/kxs/gateway/api/config/GatewayConfigProperties.java

@@ -19,7 +19,7 @@ import java.util.List;
 public class GatewayConfigProperties {
 
 	/**
-	 * 网关解密 秘钥 {@link com.kxs.gateway.api.filter.DecodeRequestGlobalFilter}
+	 * 网关解密 秘钥 {@link com.kxs.gateway.api.filter.RequestDecoderFilter}
 	 */
 	@Value("${gateway.aes.encode-key}")
 	private String encodeKey;

+ 12 - 5
kxs-gateway/src/main/java/com/kxs/gateway/api/filter/RequestDecoderFilter.java

@@ -6,6 +6,7 @@ import com.kxs.common.core.constant.enums.ErrorTypeEnum;
 import com.kxs.common.core.exception.AesDecodeException;
 import com.kxs.common.core.exception.CheckedException;
 import com.kxs.common.core.exception.ValidateCodeException;
+import io.netty.handler.codec.json.JsonObjectDecoder;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cloud.gateway.filter.GatewayFilter;
@@ -28,10 +29,14 @@ import reactor.core.publisher.Mono;
 
 import java.lang.reflect.Field;
 import java.net.URI;
+import java.util.Map;
+
 
 /**
- * @author LXQ
- * @date 2021 /2/1 密码解密工具类
+ * 请求解密处理
+ *
+ * @author 没秃顶的码农
+ * @date 2023/11/17
  */
 @Slf4j
 @RequiredArgsConstructor
@@ -39,6 +44,8 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 
 	private final AES cryptoAes;
 
+	private static final String PARAM_NAME = "value";
+
 	@Override
 	public GatewayFilter apply(Object config) {
 		return (exchange, chain) -> {
@@ -68,7 +75,7 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 				try {
 					log.info("Post请求:{},待解密请求参数:{}", request.getURI().getPath(), body);
 					String encrypt = cryptoAes.decryptStr(body);
-
+					log.info("Post请求:{},解密后参数:{}", request.getURI().getPath(), encrypt);
 					return Mono.just(encrypt);
 
 				}
@@ -106,7 +113,7 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 		// 请求链接
 		URI uri = request.getURI();
 		// 请求参数
-		String value = request.getQueryParams().getFirst("value");
+		String value = request.getQueryParams().getFirst(PARAM_NAME);
 		log.info("Get请求:{},待解密请求参数:{}", uri.getPath(), value);
 		// 判断是否有加密的参数 这里的约定是 param
 		if (CharSequenceUtil.isNotBlank(value)) {
@@ -114,7 +121,7 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 			String decryPtoData = cryptoAes.decryptStr(value);
 			log.info("Get请求:{},解密之后参数:{}", uri.getPath(), decryPtoData);
 			// 使用反射强行拿出 URI 的 query
-			Field targetQuery = uri.getClass().getDeclaredField("value");
+			Field targetQuery = uri.getClass().getDeclaredField(PARAM_NAME);
 			// 授权
 			targetQuery.setAccessible(true);
 			// 重新设置参数

+ 2 - 2
kxs-gateway/src/main/resources/application-dev.yml

@@ -7,7 +7,7 @@ spring:
             kxs-system-biz: #负载均衡
               - uri: http://127.0.0.1:8080
             kxs-codegen:
-              - uri: http://127.0.0.1:5002
+              - uri: http://127.0.0.1:4002
             kxs-quartz:
-              - uri: http://127.0.0.1:5007
+              - uri: http://127.0.0.1:4000
 

+ 7 - 7
kxs-gateway/src/main/resources/application.yml

@@ -10,21 +10,21 @@ spring:
     gateway:
       routes:
         #ADMIN 模块
-        - id: kxs-system-biz
-          uri: lb://kxs-system-biz
+        - id: kxs-system-biz  # 唯一的服务ID
+          uri: lb://kxs-system-biz # instances下的服务名称,实现负载均衡
           predicates:
-            - Path=/v1/kxs/admin/**
+            - Path=/v1/kxs/admin/** #当前服务的请求前缀,
           filters:
             # 过滤前缀
             - StripPrefix=3
             # 限流配置
             - name: RequestRateLimiter
               args:
-                key-resolver: '#{@remoteAddrKeyResolver}'
-                redis-rate-limiter.replenishRate: 100
-                redis-rate-limiter.burstCapacity: 200
+                key-resolver: '#{@remoteAddrKeyResolver}' #SPEL表达式去的对应的bean
+                redis-rate-limiter.replenishRate: 100 # 令牌桶每秒填充平均速率
+                redis-rate-limiter.burstCapacity: 200 # 令牌桶总容量
             # 验证码处理
-            - ValidateCodeGatewayFilter
+#            - ValidateCodeGatewayFilter #如果该服务需要验证码则开启此过滤器
             # 解密过滤器
 #            - RequestDecoderFilter
 

+ 1 - 1
kxs-quartz/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 server:
-  port: 5007
+  port: 4000
 
 spring:
   application:

+ 1 - 1
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/KxsAdminApplication.java

@@ -11,7 +11,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
  * <p>
  * 用户统一管理系统
  */
-@SpringBootApplication(scanBasePackages = { "com.kxs.common.**", "com.kxs.system.**" })
+@SpringBootApplication
 @EnableLoginResourceServer
 @EnableAuthResourceServer
 public class KxsAdminApplication {

+ 7 - 0
pom.xml

@@ -36,6 +36,7 @@
         <dynamic-ds.version>4.1.3</dynamic-ds.version>
         <kxs.common.version>${project.version}</kxs.common.version>
         <knife4j.version>4.3.0</knife4j.version>
+        <fastjson.version>1.2.83</fastjson.version>
     </properties>
 
     <!-- 以下依赖 全局所有的模块都会引入  -->
@@ -220,6 +221,12 @@
                 <version>${project.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>