在Spring Boot中实现请求IP白名单拦截

在Web应用中,通过IP白名单机制,我们可以允许特定的IP地址访问应用,而阻止其他IP地址。这种机制在保护管理后台、API接口等敏感资源时尤为有效。Spring Boot作为一个流行的Java框架,提供了丰富的配置和扩展能力,使得我们可以方便地实现IP白名单功能。

什么是IP白名单

IP白名单是一种访问控制机制,通过维护一个允许访问的IP地址列表,只有列表中的IP地址才可以访问特定资源。相比之下,黑名单机制则是阻止特定的IP地址访问。这两种机制都可以用于增强应用的安全性,但在某些场景下,白名单机制可能更加有效和安全。

实现IP白名单拦截的步骤

创建IP白名单配置

首先,我们需要创建一个配置类,用于存储和管理允许访问的IP地址列表。我们可以使用Spring Boot的@ConfigurationProperties注解来实现这一点。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@ConfigurationProperties(prefix = "ip.whitelist")
public class IpWhitelistProperties {
    private List<String> addresses;

    public List<String> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<String> addresses) {
        this.addresses = addresses;
    }
}

在application.yml中配置允许访问的IP地址:

ip:  whitelist:    addresses:      - "192.168.1.1"      - "192.168.1.2"

创建IP白名单拦截器

接下来,我们需要创建一个拦截器,来检查请求的IP地址是否在白名单中。我们可以实现Spring的HandlerInterceptor接口来完成这一任务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Componentpublic
class IpWhitelistInterceptor implements HandlerInterceptor {
    @Autowired
    private IpWhitelistProperties ipWhitelistProperties;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        String remoteAddr = request.getRemoteAddr();
        if (ipWhitelistProperties.getAddresses().contains(remoteAddr)) {
            return true;
        } else {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
            return false;
        }
    }
}

注册拦截器

最后,我们需要将拦截器注册到Spring Boot应用中。我们可以通过实现WebMvcConfigurer接口来完成这一任务。

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;

@Configurationpublic
class WebConfig implements WebMvcConfigurer {
    @Autowired
    private IpWhitelistInterceptor ipWhitelistInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(ipWhitelistInterceptor).addPathPatterns("/**"); // 这里可以根据需要指定拦截的路径    }}

测试与验证

至此,我们已经完成了IP白名单拦截器的实现。接下来,我们可以通过启动Spring Boot应用,并从不同的IP地址访问应用,来验证拦截器是否生效。

测试步骤

  1. 启动Spring Boot应用。

  2. 从白名单中的IP地址访问应用,确认可以正常访问。

  3. 从不在白名单中的IP地址访问应用,确认访问被拒绝。

测试结果

  • 白名单中的IP地址应能够正常访问应用的所有资源。

  • 不在白名单中的IP地址访问应用时,应返回403 Forbidden错误。

总结

本文详细介绍了如何在Spring Boot中实现基于IP白名单的请求拦截。通过这种机制,我们可以有效地控制访问权限,保护应用的敏感资源。在实际应用中,我们还可以结合其他安全措施,如用户认证和授权、HTTPS等,进一步增强应用的安全性。

主要步骤回顾

  1. 创建IP白名单配置类,用于存储和管理允许访问的IP地址。

  2. 创建IP白名单拦截器,实现请求IP地址的检查逻辑。

  3. 注册拦截器到Spring Boot应用中,使其生效。

通过以上步骤,我们可以轻松地在Spring Boot应用中实现IP白名单拦截功能。如果需要更复杂的访问控制逻辑,可以在此基础上进行扩展和优化。

### 配置 Spring Cloud Gateway 白名单Spring Cloud Gateway 中设置 IP 白名单可以通过自定义过滤器来完成。以下是详细的配置方法: #### 1. 自定义全局过滤器 通过创建一个 `GlobalFilter` 来拦截请求并验证客户端的 IP 地址是否属于白名单。 ```java import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class IpWhiteListFilter implements GlobalFilter, Ordered { private final String[] whiteList = {"127.0.0.1", "192.168.1.1"}; // 定义白名单 @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String ip = exchange.getRequest().getRemoteAddress().getHostString(); // 获取客户端IP地址 boolean isAllowed = false; for (String allowedIp : whiteList) { if (allowedIp.equals(ip)) { isAllowed = true; break; } } if (!isAllowed) { exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN); return exchange.getResponse().setComplete(); } return chain.filter(exchange); // 如果允许,则继续处理链路 } @Override public int getOrder() { return -1; // 设置优先级,越低越先执行 } } ``` 此代码片段实现了基于 IP 的访问控制逻辑[^1]。 #### 2. YML 文件中的基础配置 虽然官方文档并未提供直接针对 IP 白名单的功能支持,但仍需确保网关的基础路由功能正常运行。以下是一个简单的 YAML 路由配置示例: ```yaml spring: cloud: gateway: routes: - id: example_route uri: http://example.org predicates: - Path=/example/** ``` 上述配置指定了一个基本的路由规则,用于匹配路径 `/example/**` 并将其转发到目标 URI。 #### 3. 启动类配置 为了使 Spring Cloud Gateway 正常工作,还需要在启动类上添加必要的注解以启用服务发现等功能。例如,在项目入口处可以这样写: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } } ``` 这段代码启用了服务注册与发现的支持,便于后续扩展其他微服务架构下的功能需求[^4]。 #### 4. 动态调整白名单 如果希望实现更灵活的管理方式(比如从数据库读取或者远程调用获取最新的白名单列表),则可以在初始化阶段加载这些数据源,并定期刷新缓存内容。具体实现取决于实际业务场景和技术栈的选择[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

missterzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值