| | |
| | | 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; |
| | |
| | | |
| | | 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 { |
| | |
| | | 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)) { |
| | | if (isInRange(ip, whitelist)) { |
| | | return true; |
| | | } |
| | | } else { |
| | | // 单个IP |
| | | if (whitelist.equals(ip)) { |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 智能验证IP是否在指定的模式内 |
| | | * 支持:CIDR格式、通配符格式、单个IP |
| | | */ |
| | | public boolean isInRange(String ip, String pattern) { |
| | | if (pattern == null || ip == null) { |
| | | return false; |
| | | } |
| | | |
| | | // 1. 如果是CIDR格式(包含/) |
| | | 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. 如果是单个IP地址 |
| | | if (isValidIp(pattern)) { |
| | | return ip.equals(pattern); |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 通配符模式匹配 |
| | | */ |
| | | private boolean matchesWildcardPattern(String ip, String wildcardPattern) { |
| | | // 将通配符转换为正则表达式 |
| | | String regex = wildcardPattern.replace(".", "\\.").replace("*", "\\d+"); |
| | | |
| | | return Pattern.matches(regex, ip); |
| | | } |
| | | |
| | | /** |
| | | * 验证是否为合法IP地址 |
| | | */ |
| | | private boolean isValidIp(String ip) { |
| | | return Pattern.matches("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$", ip); |
| | | } |
| | | } |