如何通过IP限制Spring Cloud Gateway

时间:2019-07-03 07:52:28

标签: spring-cloud-gateway

我需要将对Spring Cloud Gateway的访问限制为一组特定的客户端IP(基本上是一个IP白名单)。我敢肯定,有一种简单的方法可以做到,而只是为网关调整yaml配置,而无需为该简单任务编写任何自定义过滤器代码。我该怎么办?

spring.cloud.gateway.security ...?

3 个答案:

答案 0 :(得分:1)

您可以使用RemoteAddr路由谓词工厂。您可以找到有关如何in the docs进行设置和配置的更多详细信息。

答案 1 :(得分:0)

您还可以使用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);
    };
}

答案 2 :(得分:0)

添加到@OlgaMaciaszek 的答案中。以下是如何使用 RemoteAddr 谓词。 . (如果您想以编程方式添加列入白名单的 Ips 而不是在 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。浏览课程/文档以获得更多理解。