SpringBoot对外接口IP黑白名单的设计与实施

一、引言

在现今的网络应用中,接口的安全性是至关重要的一环。IP黑白名单机制作为一种常见的安全策略,可以有效地控制哪些IP地址可以访问我们的服务接口,哪些IP地址则被拒绝访问。本文将介绍在Spring Boot如何实施IP黑白名单限制。

二、为什么对外接口要设计黑白名单

设计IP黑白名单机制的主要原因是为了提高接口的安全性、可控性和灵活性。通过限制访问IP,我们可以防止恶意攻击和未经授权的访问,确保服务的稳定运行。同时,黑白名单的动态调整也为我们提供了灵活的访问控制手段。

三、Spring Boot基于拦截器实现黑白名单限制

在Spring Boot中,我们可以利用拦截器(Interceptor)机制来实现IP黑白名单限制。以下是一个简单的实现步骤和代码示例:

3.1 创建自定义拦截器

首先,我们需要创建一个自定义的拦截器类,实现HandlerInterceptor接口。在preHandle方法中,我们可以检查请求的IP地址是否在黑白名单中。

java 复制代码
/**
* https://www.sanzhiwa.top/6769.html
* 2023年张雪峰志愿填报
*/
import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public class IpBasedInterceptor implements HandlerInterceptor {  
  
       private final IpUtil ipUtil;  
    private final IpConfigProperties ipConfigProperties;  
  
    @Autowired  
    public IpBasedInterceptor(IpUtil ipUtil, IpConfigProperties ipConfigProperties) {  
        this.ipUtil = ipUtil;  
        this.ipConfigProperties = ipConfigProperties;  
    }  
  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
        String ipAddress = ipUtil.getIpAddress(request); // 假设IpUtil能处理request以获取IP  
  
        boolean isWhiteListed = isIpWhiteListed(ipAddress);  
        boolean isBlackListed = isIpBlackListed(ipAddress);  
  
        // 如果IP在黑名单中,拒绝访问  
        if (isBlackListed) {  
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);  
            response.getWriter().write("IP address is blacklisted. Access denied.");  
            return false; // 阻止请求继续处理  
        }  
  
        // 如果IP不在白名单中(假设只有白名单中的IP可以访问),也拒绝访问  
        if (!isWhiteListed && requiresWhitelist()) {  
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);  
            response.getWriter().write("IP address is not whitelisted. Access denied.");  
            return false; // 阻止请求继续处理  
        }  
  
        // 如果IP在白名单中或没有白名单要求,则允许访问  
        return true;  
    }  
  
    @Override  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
        // 在请求处理之后进行调用(在视图渲染之前),可用于资源清理  
    }  
  
    @Override  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  
        // 在整个请求完成后调用,即在视图渲染之后调用,用于资源清理  
    }  
  
     // 辅助方法  
    private boolean isIpWhiteListed(String ipAddress) {  
        return ipConfigProperties.getWhitelist().contains(ipAddress);  
    }  
  
    private boolean isIpBlackListed(String ipAddress) {  
        return ipConfigProperties.getBlacklist().contains(ipAddress);  
    }  
  
    // 模拟方法,检查是否需要白名单  
    private boolean requiresWhitelist() {  
        // 根据你的应用逻辑决定是否需要白名单限制  
        // 这里只是简单返回true作为示例  
        return true;  
    }  
}
3.2 获取IP工具类

从HTTP请求头中获取客户端IP地址的几种可能情况,包括从反向代理服务器传递的IP地址

java 复制代码
/**
* https://www.sanzhiwa.top/6753.html
* 如果历史是一群喵1-10季
*/
import org.springframework.web.context.request.RequestContextHolder;  
import org.springframework.web.context.request.ServletRequestAttributes;  
  
import javax.servlet.http.HttpServletRequest;  
import org.apache.commons.lang3.StringUtils; // 确保导入了正确的StringUtils类  
  
public class IpUtil {  
    
  
    public static String getIpAddress() {  
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();  
        String ip = request.getHeader("x-forwarded-for");  
        if (StringUtils.isBlank(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
        }  
        if (StringUtils.isBlank(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
        }  
        if (StringUtils.isBlank(ip)) {  
            ip = request.getRemoteAddr();  
        }  
  
        // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割  
        if (StringUtils.isNotBlank(ip) && ip.contains(",")) {  
            int commaIndex = ip.indexOf(',');  
            if (commaIndex > 0) {  
                ip = ip.substring(0, commaIndex);  
            }  
        }  
        return ip;  
    }  
}
3.3 黑白IP配置

可以使用Spring Boot的@ConfigurationProperties注解来绑定配置到Java对象的属性上

java 复制代码
/**
* 央视推荐纪录片唤醒孩子内驱力
* https://www.sanzhiwa.top/6750.html
*/
import org.springframework.boot.context.properties.ConfigurationProperties;  
import org.springframework.stereotype.Component;  
  
import java.util.List;  
  
@Component  
@ConfigurationProperties(prefix = "ip")  
public class IpConfigProperties {  
  
    private List<String> whitelist;  
    private List<String> blacklist;  
  
    // 标准的getter和setter方法  
    public List<String> getWhitelist() {  
        return whitelist;  
    }  
  
    public void setWhitelist(List<String> whitelist) {  
        this.whitelist = whitelist;  
    }  
  
    public List<String> getBlacklist() {  
        return blacklist;  
    }  
  
    public void setBlacklist(List<String> blacklist) {  
        this.blacklist = blacklist;  
    }  
}

然后,在application.yml配置文件中添加IP黑白名单:

html 复制代码
ip:  
  whitelist:  
    - 192.168.1.1  
    - 10.0.0.100  
  blacklist:  
    - 10.0.0.1  
    - 172.16.0.1
3.4 配置拦截器

在Spring Boot的配置类中,我们需要将自定义的拦截器注册到拦截器链中,并指定需要拦截的路径。

java 复制代码
/**
* 央视力荐72部搞钱纪录片搞钱先搞脑
* https://www.sanzhiwa.top/6736.html
*/
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
    @Autowired  
    private IpBasedInterceptor ipBasedInterceptor;  
  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        // 添加拦截器,并定义需要拦截的路径  
        // 例如,拦截所有以"/api"开头的请求  
        registry.addInterceptor(ipBasedInterceptor).addPathPatterns("/api/**");  
    }  
}

四、总结

IP黑白名单机制是确保接口安全性的重要措施之一。在Spring Boot中,我们可以利用拦截器机制实现IP黑白名单限制,需要我们根据实际情况进行配置和调整,以确保系统的安全性和稳定性。同时,我们也需要不断学习和掌握新的安全技术和方法,以应对日益复杂的网络安全威胁。

相关推荐
大模型码小白4 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司4 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地5 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
莫逸风8 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
隔窗听雨眠8 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
z123456789869 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin5211239 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员9 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风336610 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李10 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端