From b9522d131e168a92c88f23e2c0a3a2df079926b4 Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期一, 19 八月 2024 17:43:43 +0800
Subject: [PATCH] 新增加小程序接口

---
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java |  288 ++++++++++++++++++++++++++++-----------------------------
 1 files changed, 141 insertions(+), 147 deletions(-)

diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
index 7ea17ff..8dac047 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
@@ -40,155 +40,149 @@
 
 /**
  * 网关鉴权
- * 
+ *
  * @author ruoyi
  */
 @Component
 public class SignFilter implements GlobalFilter, Ordered {
-    private static final Logger log = LoggerFactory.getLogger(SignFilter.class);
-
-    // 排除过滤的 uri 地址,nacos自行添加
-    @Autowired
-    private IgnoreWhiteProperties ignoreWhite;
-
-    @Autowired
-    private RedisService redisService;
-    
-    @Value("${security.sign}")
-    private boolean parameter_signature;
-
-
-    @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        ServerHttpRequest request = exchange.getRequest();
-        ServerHttpRequest.Builder mutate = request.mutate();
-    
-        HttpMethod method = request.getMethod();
-        if(method != HttpMethod.POST){
-            return chain.filter(exchange.mutate().request(mutate.build()).build());
-        }
-        String sign = request.getHeaders().getFirst(TokenConstants.SIGN);
-        String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR);
-        if (parameter_signature && StringUtils.isEmpty(sign)) {
-            return unauthorizedResponse(exchange, "签名不能为空!");
-        }
-        if (parameter_signature && StringUtils.isEmpty(nonce_str)) {
-            return unauthorizedResponse(exchange, "签名不能为空!");
-        }
-        if(parameter_signature){
-            return authSign(exchange, chain, sign, nonce_str);
-        }
-        return chain.filter(exchange.mutate().request(mutate.build()).build());
-    }
-
-
-
-    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
-        log.error("[签名异常处理]请求路径:{}", exchange.getRequest().getPath());
-        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.BAD_REQUEST);
-    }
-    
-    
-    /**
-     * 校验签名
-     * @return
-     */
-    private Mono<Void> authSign(ServerWebExchange exchange, GatewayFilterChain chain, String sign, String nonce_str){
-        return DataBufferUtils.join(exchange.getRequest().getBody())
-                .flatMap(dataBuffer -> {
-                    byte[] bytes = new byte[dataBuffer.readableByteCount()];
-                    dataBuffer.read(bytes);
-                    String bodyString = new String(bytes, StandardCharsets.UTF_8);
-                    log.info("请求参数:{}", bodyString);
-                    if(!authSign(JSON.parseObject(bodyString), sign, nonce_str)){
-                        return unauthorizedResponse(exchange, "签名验证失败!");
-                    }
-                    DataBufferUtils.release(dataBuffer);
-                    Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
-                        DataBuffer buffer = exchange.getResponse().bufferFactory()
-                                .wrap(bytes);
-                        return Mono.just(buffer);
-                    });
-                    ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
-                        @Override
-                        public Flux<DataBuffer> getBody() {
-                            return cachedFlux;
-                        }
-                    };
-                    return chain.filter(exchange.mutate().request(mutatedRequest)
-                            .build());
-        });
-    }
-    
-    
-    
-    /**
-     * 签名校验
-     * @return
-     */
-    private boolean authSign(JSONObject jsonStr, String sign, String nonce_str) {
-        System.err.println("请求签名:" + sign);
-        String signUrlEncode = localSignUrl(jsonStr, nonce_str);
-        signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(")
-                .replaceAll("& #41;", "\\)");
-        if(sign.equals(signUrlEncode)){
-            return true;
-        }
-        System.err.println("签名值:" + signUrlEncode);
-        return false;
-    }
-    
-    
-    /**
-     * 组装签名路径
-     * @param params
-     * @return
-     */
-    public static String localSignUrl(JSONObject params, String key) {
-        List<String> keySet = new ArrayList<>(params.keySet());
-        // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
-        Collections.sort(keySet, new Comparator<String>() {
-            @Override
-            public int compare(String o1, String o2) {
-                return o1.compareTo(o2);
-            }
-        });
-        // 构造签名键值对的格式
-        StringBuilder sb = new StringBuilder();
-        for (String k : keySet) {
-            String v = params.getString(k);
-            if(StringUtils.isNotEmpty(v)){
-                sb.append(k + "=" + v + "&");
-            }
-        }
-        String signUrl = sb.substring(0, sb.length() - 1);
-        System.err.println("签名串:" + signUrl);
-        return signUrlEncode(signUrl, key);
-    }
-    
-    
-    /**
-     * 签名字符串加密
-     * @param signUrl
-     * @param encryptKey
-     * @return
-     */
-    public static String signUrlEncode(String signUrl, String encryptKey) {
-        byte[] signByte = new byte[0];
-        try {
-            signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey);
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
-        }
-        String localSign = Base64.encodeBase64String(signByte);
-        return localSign;
-    }
-    
-    
-    @Override
-    public int getOrder()
-    {
-        return -200;
-    }
+	private static final Logger log = LoggerFactory.getLogger(SignFilter.class);
+	
+	// 排除过滤的 uri 地址,nacos自行添加
+	@Autowired
+	private IgnoreWhiteProperties ignoreWhite;
+	
+	@Autowired
+	private RedisService redisService;
+	
+	@Value("${security.sign}")
+	private boolean parameter_signature;
+	
+	/**
+	 * 组装签名路径
+	 *
+	 * @param params
+	 * @return
+	 */
+	public static String localSignUrl(JSONObject params, String key) {
+		List<String> keySet = new ArrayList<>(params.keySet());
+		// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+		Collections.sort(keySet, new Comparator<String>() {
+			@Override
+			public int compare(String o1, String o2) {
+				return o1.compareTo(o2);
+			}
+		});
+		// 构造签名键值对的格式
+		StringBuilder sb = new StringBuilder();
+		for (String k : keySet) {
+			String v = params.getString(k);
+			if (StringUtils.isNotEmpty(v)) {
+				sb.append(k + "=" + v + "&");
+			}
+		}
+		String signUrl = sb.substring(0, sb.length() - 1);
+		System.err.println("签名串:" + signUrl);
+		return signUrlEncode(signUrl, key);
+	}
+	
+	/**
+	 * 签名字符串加密
+	 *
+	 * @param signUrl
+	 * @param encryptKey
+	 * @return
+	 */
+	public static String signUrlEncode(String signUrl, String encryptKey) {
+		byte[] signByte = new byte[0];
+		try {
+			signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+		String localSign = Base64.encodeBase64String(signByte);
+		return localSign;
+	}
+	
+	@Override
+	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+		ServerHttpRequest request = exchange.getRequest();
+		ServerHttpRequest.Builder mutate = request.mutate();
+		
+		HttpMethod method = request.getMethod();
+		if (method != HttpMethod.POST) {
+			return chain.filter(exchange.mutate().request(mutate.build()).build());
+		}
+		String sign = request.getHeaders().getFirst(TokenConstants.SIGN);
+		String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR);
+		if (parameter_signature && StringUtils.isEmpty(sign)) {
+			return unauthorizedResponse(exchange, "签名不能为空!");
+		}
+		if (parameter_signature && StringUtils.isEmpty(nonce_str)) {
+			return unauthorizedResponse(exchange, "签名不能为空!");
+		}
+		if (parameter_signature) {
+			return authSign(exchange, chain, sign, nonce_str);
+		}
+		return chain.filter(exchange.mutate().request(mutate.build()).build());
+	}
+	
+	private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
+		log.error("[签名异常处理]请求路径:{}", exchange.getRequest().getPath());
+		return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.BAD_REQUEST);
+	}
+	
+	/**
+	 * 校验签名
+	 *
+	 * @return
+	 */
+	private Mono<Void> authSign(ServerWebExchange exchange, GatewayFilterChain chain, String sign, String nonce_str) {
+		return DataBufferUtils.join(exchange.getRequest().getBody())
+				.flatMap(dataBuffer -> {
+					byte[] bytes = new byte[dataBuffer.readableByteCount()];
+					dataBuffer.read(bytes);
+					String bodyString = new String(bytes, StandardCharsets.UTF_8);
+					log.info("请求参数:{}", bodyString);
+					if (!authSign(JSON.parseObject(bodyString), sign, nonce_str)) {
+						return unauthorizedResponse(exchange, "签名验证失败!");
+					}
+					DataBufferUtils.release(dataBuffer);
+					Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
+						DataBuffer buffer = exchange.getResponse().bufferFactory()
+								.wrap(bytes);
+						return Mono.just(buffer);
+					});
+					ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
+						@Override
+						public Flux<DataBuffer> getBody() {
+							return cachedFlux;
+						}
+					};
+					return chain.filter(exchange.mutate().request(mutatedRequest)
+							.build());
+				});
+	}
+	
+	/**
+	 * 签名校验
+	 *
+	 * @return
+	 */
+	private boolean authSign(JSONObject jsonStr, String sign, String nonce_str) {
+		System.err.println("请求签名:" + sign);
+		String signUrlEncode = localSignUrl(jsonStr, nonce_str);
+		signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(")
+				.replaceAll("& #41;", "\\)");
+		if (sign.equals(signUrlEncode)) {
+			return true;
+		}
+		System.err.println("签名值:" + signUrlEncode);
+		return false;
+	}
+	
+	@Override
+	public int getOrder() {
+		return -200;
+	}
 }
\ No newline at end of file

--
Gitblit v1.7.1