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


    一、引言

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

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

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

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

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

    3.1 创建自定义拦截器

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

    1. /**
    2. * https://www.sanzhiwa.top/6769.html
    3. * 2023年张雪峰志愿填报
    4. */
    5. import org.springframework.web.servlet.HandlerInterceptor;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. public class IpBasedInterceptor implements HandlerInterceptor {
    10. private final IpUtil ipUtil;
    11. private final IpConfigProperties ipConfigProperties;
    12. @Autowired
    13. public IpBasedInterceptor(IpUtil ipUtil, IpConfigProperties ipConfigProperties) {
    14. this.ipUtil = ipUtil;
    15. this.ipConfigProperties = ipConfigProperties;
    16. }
    17. @Override
    18. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    19. String ipAddress = ipUtil.getIpAddress(request); // 假设IpUtil能处理request以获取IP
    20. boolean isWhiteListed = isIpWhiteListed(ipAddress);
    21. boolean isBlackListed = isIpBlackListed(ipAddress);
    22. // 如果IP在黑名单中,拒绝访问
    23. if (isBlackListed) {
    24. response.setStatus(HttpServletResponse.SC_FORBIDDEN);
    25. response.getWriter().write("IP address is blacklisted. Access denied.");
    26. return false; // 阻止请求继续处理
    27. }
    28. // 如果IP不在白名单中(假设只有白名单中的IP可以访问),也拒绝访问
    29. if (!isWhiteListed && requiresWhitelist()) {
    30. response.setStatus(HttpServletResponse.SC_FORBIDDEN);
    31. response.getWriter().write("IP address is not whitelisted. Access denied.");
    32. return false; // 阻止请求继续处理
    33. }
    34. // 如果IP在白名单中或没有白名单要求,则允许访问
    35. return true;
    36. }
    37. @Override
    38. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    39. // 在请求处理之后进行调用(在视图渲染之前),可用于资源清理
    40. }
    41. @Override
    42. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    43. // 在整个请求完成后调用,即在视图渲染之后调用,用于资源清理
    44. }
    45. // 辅助方法
    46. private boolean isIpWhiteListed(String ipAddress) {
    47. return ipConfigProperties.getWhitelist().contains(ipAddress);
    48. }
    49. private boolean isIpBlackListed(String ipAddress) {
    50. return ipConfigProperties.getBlacklist().contains(ipAddress);
    51. }
    52. // 模拟方法,检查是否需要白名单
    53. private boolean requiresWhitelist() {
    54. // 根据你的应用逻辑决定是否需要白名单限制
    55. // 这里只是简单返回true作为示例
    56. return true;
    57. }
    58. }
    3.2 获取IP工具类

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

    1. /**
    2. * https://www.sanzhiwa.top/6753.html
    3. * 如果历史是一群喵1-10季
    4. */
    5. import org.springframework.web.context.request.RequestContextHolder;
    6. import org.springframework.web.context.request.ServletRequestAttributes;
    7. import javax.servlet.http.HttpServletRequest;
    8. import org.apache.commons.lang3.StringUtils; // 确保导入了正确的StringUtils类
    9. public class IpUtil {
    10. public static String getIpAddress() {
    11. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    12. String ip = request.getHeader("x-forwarded-for");
    13. if (StringUtils.isBlank(ip)) {
    14. ip = request.getHeader("Proxy-Client-IP");
    15. }
    16. if (StringUtils.isBlank(ip)) {
    17. ip = request.getHeader("WL-Proxy-Client-IP");
    18. }
    19. if (StringUtils.isBlank(ip)) {
    20. ip = request.getRemoteAddr();
    21. }
    22. // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
    23. if (StringUtils.isNotBlank(ip) && ip.contains(",")) {
    24. int commaIndex = ip.indexOf(',');
    25. if (commaIndex > 0) {
    26. ip = ip.substring(0, commaIndex);
    27. }
    28. }
    29. return ip;
    30. }
    31. }
    3.3 黑白IP配置

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

    1. /**
    2. * 央视推荐纪录片唤醒孩子内驱力
    3. * https://www.sanzhiwa.top/6750.html
    4. */
    5. import org.springframework.boot.context.properties.ConfigurationProperties;
    6. import org.springframework.stereotype.Component;
    7. import java.util.List;
    8. @Component
    9. @ConfigurationProperties(prefix = "ip")
    10. public class IpConfigProperties {
    11. private List whitelist;
    12. private List blacklist;
    13. // 标准的getter和setter方法
    14. public List getWhitelist() {
    15. return whitelist;
    16. }
    17. public void setWhitelist(List whitelist) {
    18. this.whitelist = whitelist;
    19. }
    20. public List getBlacklist() {
    21. return blacklist;
    22. }
    23. public void setBlacklist(List blacklist) {
    24. this.blacklist = blacklist;
    25. }
    26. }

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

    1. ip:
    2. whitelist:
    3. - 192.168.1.1
    4. - 10.0.0.100
    5. blacklist:
    6. - 10.0.0.1
    7. - 172.16.0.1
    3.4 配置拦截器

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

    1. /**
    2. * 央视力荐72部搞钱纪录片搞钱先搞脑
    3. * https://www.sanzhiwa.top/6736.html
    4. */
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.context.annotation.Configuration;
    7. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    8. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    9. @Configuration
    10. public class WebConfig implements WebMvcConfigurer {
    11. @Autowired
    12. private IpBasedInterceptor ipBasedInterceptor;
    13. @Override
    14. public void addInterceptors(InterceptorRegistry registry) {
    15. // 添加拦截器,并定义需要拦截的路径
    16. // 例如,拦截所有以"/api"开头的请求
    17. registry.addInterceptor(ipBasedInterceptor).addPathPatterns("/api/**");
    18. }
    19. }

    四、总结

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

  • 相关阅读:
    SELinux零知识学习八、SELinux策略语言之客体类别和许可(2)
    O2OA(翱途)开发平台 V8.2已发布,更安全、更高效、更开放
    【计时器】
    (十三)Java算法:基数排序(详细图解)
    鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统项目背景
    计算机毕业设计源代码java项目开发实例精品springboot项目源代码家政服务预订系统[包运行成功]
    Windows Server 2019 搭建WEB环境(IIS+CA)
    题目 1063: 二级C语言-统计字符
    在线阅览md文件
    过去几个月,他们把数字化融进了中国经济的毛细血管
  • 原文地址:https://blog.csdn.net/star20100906/article/details/139952494