From b5d8fe9ffa3f665709247055441da4d9fa95ce9a Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期二, 09 九月 2025 11:44:54 +0800
Subject: [PATCH] IP安全验证修改

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/IpWhitelistInterceptor.java |   65 ++++++++++++++++++++++++++------
 1 files changed, 52 insertions(+), 13 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/IpWhitelistInterceptor.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/IpWhitelistInterceptor.java
index 277238a..aa80b2e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/IpWhitelistInterceptor.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/hanler/IpWhitelistInterceptor.java
@@ -5,7 +5,6 @@
 import com.ruoyi.system.mapper.SysConfigMapper;
 import org.apache.commons.net.util.SubnetUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 import org.springframework.web.method.HandlerMethod;
@@ -13,9 +12,9 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.regex.Pattern;
 
 @Component
 public class IpWhitelistInterceptor implements HandlerInterceptor {
@@ -61,17 +60,8 @@
             SysConfig sysConfig = sysConfigMapper.selectConfig(config);
             List<String> whitelistIps = Arrays.asList(sysConfig.getConfigValue().split(","));
             for (String whitelist : whitelistIps) {
-                if (whitelist.contains("/")) {
-                    // CIDR鏍煎紡
-                    SubnetUtils subnetUtils = new SubnetUtils(whitelist);
-                    if (subnetUtils.getInfo().isInRange(ip)) {
-                        return true;
-                    }
-                } else {
-                    // 鍗曚釜IP
-                    if (whitelist.equals(ip)) {
-                        return true;
-                    }
+                if (isInRange(ip, whitelist)) {
+                    return true;
                 }
             }
         } catch (Exception e) {
@@ -79,4 +69,53 @@
         }
         return false;
     }
+
+    /**
+     * 鏅鸿兘楠岃瘉IP鏄惁鍦ㄦ寚瀹氱殑妯″紡鍐�
+     * 鏀寔锛欳IDR鏍煎紡銆侀�氶厤绗︽牸寮忋�佸崟涓狪P
+     */
+    public boolean isInRange(String ip, String pattern) {
+        if (pattern == null || ip == null) {
+            return false;
+        }
+
+        // 1. 濡傛灉鏄疌IDR鏍煎紡锛堝寘鍚�/锛�
+        if (pattern.contains("/")) {
+            try {
+                SubnetUtils utils = new SubnetUtils(pattern);
+                return utils.getInfo().isInRange(ip);
+            } catch (IllegalArgumentException e) {
+                return false;
+            }
+        }
+
+        // 2. 濡傛灉鏄�氶厤绗︽牸寮忥紙鍖呭惈*锛�
+        if (pattern.contains("*")) {
+            return matchesWildcardPattern(ip, pattern);
+        }
+
+        // 3. 濡傛灉鏄崟涓狪P鍦板潃
+        if (isValidIp(pattern)) {
+            return ip.equals(pattern);
+        }
+
+        return false;
+    }
+
+    /**
+     * 閫氶厤绗︽ā寮忓尮閰�
+     */
+    private boolean matchesWildcardPattern(String ip, String wildcardPattern) {
+        // 灏嗛�氶厤绗﹁浆鎹负姝e垯琛ㄨ揪寮�
+        String regex = wildcardPattern.replace(".", "\\.").replace("*", "\\d+");
+
+        return Pattern.matches(regex, ip);
+    }
+
+    /**
+     * 楠岃瘉鏄惁涓哄悎娉旾P鍦板潃
+     */
+    private boolean isValidIp(String ip) {
+        return Pattern.matches("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$", ip);
+    }
 }

--
Gitblit v1.9.3