From bed6becab65745585281ba2e499fa39de561c29f Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期五, 09 八月 2024 16:47:28 +0800
Subject: [PATCH] 提交管理后台部分接口

---
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java |  136 +++++----------------------------------------
 1 files changed, 15 insertions(+), 121 deletions(-)

diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
index fe449a9..6d3e498 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
@@ -50,52 +50,41 @@
     // 跨站脚本的 xss 配置,nacos自行添加
     @Autowired
     private XssProperties xss;
-    
-    @Value("${security.sign}")
-    private boolean parameter_signature;
 
     @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
-    {
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
         ServerHttpRequest request = exchange.getRequest();
         // xss开关未开启 或 通过nacos关闭,不过滤
-        if (!xss.getEnabled())
-        {
+        if (!xss.getEnabled()) {
             return chain.filter(exchange);
         }
         // GET DELETE 不过滤
         HttpMethod method = request.getMethod();
-        if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE)
-        {
+        if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) {
             return chain.filter(exchange);
         }
         // 非json类型,不过滤
-        if (!isJsonRequest(exchange))
-        {
+        if (!isJsonRequest(exchange)) {
             return chain.filter(exchange);
         }
         // excludeUrls 不过滤
         String url = request.getURI().getPath();
-        if (StringUtils.matches(url, xss.getExcludeUrls()))
-        {
+        if (StringUtils.matches(url, xss.getExcludeUrls())) {
             return chain.filter(exchange);
         }
         ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
-        if(parameter_signature && !authSign(httpRequestDecorator)){
-            log.error("[鉴权签名异常处理]请求路径:{}", exchange.getRequest().getPath());
-            return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "签名校验失败", HttpStatus.BAD_REQUEST);
-        }
         return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
-
     }
 
-    private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange)
-    {
-        ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest())
-        {
+    
+    
+    
+    
+    
+    private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
+        ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
             @Override
-            public Flux<DataBuffer> getBody()
-            {
+            public Flux<DataBuffer> getBody() {
                 Flux<DataBuffer> body = super.getBody();
                 return body.buffer().map(dataBuffers -> {
                     DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
@@ -116,8 +105,7 @@
             }
 
             @Override
-            public HttpHeaders getHeaders()
-            {
+            public HttpHeaders getHeaders() {
                 HttpHeaders httpHeaders = new HttpHeaders();
                 httpHeaders.putAll(super.getHeaders());
                 // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
@@ -135,104 +123,10 @@
      * 
      * @param exchange HTTP请求
      */
-    public boolean isJsonRequest(ServerWebExchange exchange)
-    {
+    public boolean isJsonRequest(ServerWebExchange exchange) {
         String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
         return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
     }
-    
-    
-    /**
-     * 签名校验
-     * @param httpRequestDecorator
-     * @return
-     */
-    private boolean authSign(ServerHttpRequestDecorator httpRequestDecorator) {
-        HttpHeaders headers = httpRequestDecorator.getHeaders();
-        AtomicReference<JSONObject> jsonObject = new AtomicReference<>(new JSONObject());
-        httpRequestDecorator.getBody().buffer().map(dataBuffers -> {
-            DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
-            DataBuffer join = dataBufferFactory.join(dataBuffers);
-            byte[] content = new byte[join.readableByteCount()];
-            join.read(content);
-            DataBufferUtils.release(join);
-            String bodyStr = new String(content, StandardCharsets.UTF_8);
-            jsonObject.set(JSON.parseObject(bodyStr));
-        
-            // 防xss攻击过滤
-            bodyStr = EscapeUtil.clean(bodyStr);
-            // 转成字节
-            byte[] bytes = bodyStr.getBytes();
-            NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
-            DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
-            buffer.write(bytes);
-            return buffer;
-        });
-        JSONObject params = jsonObject.get();
-        String sign = headers.getFirst(TokenConstants.SING);
-        if(StringUtils.isEmpty(sign)){
-            return false;
-        }
-        String nonce_str = headers.getFirst(TokenConstants.NONCE_STR);
-        if(StringUtils.isEmpty(nonce_str)){
-            return false;
-        }
-    
-        String signUrlEncode = localSignUrl(params, nonce_str);
-        signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(")
-                .replaceAll("& #41;", "\\)")
-                .replaceAll("\\+", " ");
-        if(sign.equals(signUrlEncode)){
-            return true;
-        }
-        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);
-        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) {
-            throw new RuntimeException(e);
-        }
-        String localSign = Base64.encodeBase64String(signByte);
-        return localSign;
-    }
-    
     
     @Override
     public int getOrder()

--
Gitblit v1.7.1