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黑白名单限制,需要我们根据实际情况进行配置和调整,以确保系统的安全性和稳定性。同时,我们也需要不断学习和掌握新的安全技术和方法,以应对日益复杂的网络安全威胁。

相关推荐
游王子39 分钟前
Springboot与xxl-job
java·spring boot·后端
秋刀prince1 小时前
【JD-GUI】MacOS 中使用Java反编译工具JD-GUI
java·macos·策略模式
青云交1 小时前
Java面试题--JVM大厂篇之G1 GC的分区管理方式如何减少应用线程的影响
java·垃圾回收器(gc)的性能·区域划分(region)·并行和并发回收·区域优先回收·可预测的停顿时间·jvm算法
codefly-xtl2 小时前
探索 Java 8 中的 Stream API
java
Jack_hrx2 小时前
在 Java 中从 for 循环中移出元素的原理及解决方案
java·循环·for循环·数组下标越界
科学的发展-只不过是读大自然写的代码2 小时前
qt 读写json格式的文件应用举例 工具函数
java·qt·json
qq17239350582 小时前
学习java第一百一十六天
java·开发语言·学习
FM_南风2 小时前
java定时任务实现
java·开发语言
csdncjh2 小时前
spring boot初始化的几个总结
java·spring boot
G皮T2 小时前
【Spring Boot】Java 持久层 API:JPA
java·spring boot·hibernate·jpa·spring data