如何通过IP限制弹簧云网关



我需要限制访问我对特定客户端IPS集的春季云网关(基本上是具有IP白名单(。我相信只有一种简单的方法可以做到这一点,但是对网关进行调整YAML配置,而不需要任何自定义的过滤器编码来完成该简单任务。我该怎么办?

spring.cloud.gateway.security ...?

您可以使用remoteaddr路由谓词工厂。您可以找到有关如何设置并在文档中进行配置的更多详细信息。

添加到@olgamaciaszek的答案中。这是您可以使用remoteaddr谓词的方法。。(如果您想编程添加白名单的IP而不是在yaml文件中进行硬编码(

List<String> whitelist = <your list of whitelisted Ips> ;
RemoteAddrRoutePredicateFactory predicateFactory = new RemoteAddrRoutePredicateFactory();
if (!predicateFactory.apply(predicateFactory.newConfig()
                .setRemoteAddressResolver(XForwardedRemoteAddressResolver.maxTrustedIndex(2)).setSources(whitelist))
                .test(exchange)) {
       log.error("IP not whitelisted. Stopping futher communications.");
       return GatewayResponseHelper.setIPNotWhiteListResponse(exchange);
            }
log.info("IP is whitelisted. Proceeding with request.");
return chain.filter(exchange);

,如果您的服务在某个代理层后面,则可以使用XforwardedRemoteadDressResolver。或默认的remoteadDressresolver。通过课程/文档以获得更多理解。

您还可以使用GlobalFilter限制访问。它过滤所有请求,如果不是简单的遥控地址限制,您可以将自定义的逻辑放入过滤器中。

@Bean
@Order(-1)
public GlobalFilter whitelistFilter() {
    return (exchange, chain) -> {
        // TODO - init your whitelist
        List<String> whitelist = new ArrayList<>();
        whitelist.add("localhost");
        // verify request remote address
        String id = exchange.getRequest().getRemoteAddress().getHostName();
        if (!whitelist.contains(id)) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        return chain.filter(exchange);
    };
}

相关内容

  • 没有找到相关文章

最新更新