我在amazonec2机器上有两个spring引导服务(配置为使用jersey 2),为其分配了弹性ip(比如35.140.30.20)。在这两个服务前面有一个apache,它提供静态内容并通过mod proxy将服务调用转发给java服务。现在我希望一个服务访问另一个,并通过如下spring配置屏蔽来自外部的访问:
public void configure(HttpSecurity http) throws
http.headers()
.and()
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/secure").access("isAnonymous() and hasIpAddress('192.168.100.0/24')")
.antMatchers(HttpMethod.GET, "/public").permitAll()
.antMatchers("/**").denyAll()
.and()
.addFilterAfter(createCorsFilter(), LogoutFilter.class);
}
为此,我在一个服务中创建了一个jersey客户端:
ClientBuilder clientBuilder = ClientBuilder.newBuilder();
ClientConfig config = new ClientConfig();
Client jerseyClient = clientBuilder..withConfig(config).build();
WebTarget target = jerseyClient.target("https://localhost").path("service/secure");
target = target.queryParam("test", test);
Builder request = target.request();
request.accept(MediaType.APPLICATION_JSON);
String response = request.get(String.class);
在我的本地开发机器上,一切正常。客户端可以成功地访问端点,而来自网络之外的任何其他计算机的请求都会被阻止。然而,我的ec2示例的情况是不同的。该示例有两个网络接口:
eth0 Link encap:Ethernet HWaddr 06:34:12:AC:00:8A
inet addr:192.168.100.2 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::434:12ff:feac:8a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
我希望服务使用两个本地接口之一的地址来进行调用。但在监听服务中,我看到请求来自35.140.30.20,因此被拒绝。我还将可用的网络接口记录在请求服务中,该服务只生成上述两个接口。我不能在安全配置中使用弹性ip,因为从apache转发的每个请求也都来自该ip,这也有点奇怪,但我可以理解,因为apache实际上是通过该ip直接访问的。
那么我的spring引导服务怎么知道这个ip呢?我怎样才能让它使用本地网络呢?
整个事情是一个更大的项目中的概念证明,所以我真的不能分享更多的代码或工作程序。
暂无答案!
目前还没有任何答案,快来回答吧!