Do sprawdzenia bezpieczeństwa potrzebuję dostępu do zdalnego adresu IP użytkownika w mojej usłudze zasobów. Serwis ten zasób jest prosta niedawno app Wiosna Boot, który rejestruje się z moim serwerze Eureka:Uzyskiwanie dostępu do zdalnego adresu IP na serwerze zasobów proxy za pośrednictwem Zuul i Apache
@SpringBootApplication
@EnableEurekaClient
public class ServletInitializer extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(ServletInitializer.class, args);
}
}
Wszystkie usługi zarejestrowanych z mojego serwera Eureka dynamicznie kierowane przez moją Zuul serwera proxy routing w oparciu o Angel.SR3 starter-zuul
i starter-eureka
:
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class RoutingProxyServer {
public static void main(final String[] args) {
SpringApplication.run(RoutingProxyServer.class, args);
}
}
serwer proxy trasowania Zuul konfiguruje również złącze AJP do następnego etapu:
@Configuration
@ConditionalOnProperty("ajp.port")
public class TomcatAjpConfig extends TomcatWebSocketContainerCustomizer {
@Value("${ajp.port}")
private int port;
@Override
public void doCustomize(final TomcatEmbeddedServletContainerFactory tomcat) {
super.doCustomize(tomcat);
// Listen for AJP requests
Connector ajp = new Connector("AJP/1.3");
ajp.setPort(port);
tomcat.addAdditionalTomcatConnectors(ajp);
}
}
Wszystkie wnioski do dynamicznego routingu Zuul pełnomocnika są przekierowywane siebie poprzez Apache dostarczyć HTTPS na standardowym 443 port:
# Preserve Host when proxying so jar apps return working URLs in JSON responses
RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost On
# Redirect remaining traffic to routing proxy server
ProxyPass / ajp://192.168.x.x:8009/
# Also update Location, Content-Location and URI headers on HTTP redirect responses
ProxyPassReverse / ajp://192.168.x.x:8009/
Mając to wszystko na miejscu usługa zasób jest dostępny, ale niestety remoteAddress że dostanę od Spring Security jest adresem serwera proxy Zuul/Apache, a nie adresem IP klienta zdalnego.
W przeszłości używał org.springframework.security.authentication.AuthenticationDetailsSource
że preferowaną wartość X-Forwarded-For
nagłówka nad normalnym remoteAddress
aby uzyskać prawidłowy adres IP, ale nie może pracować się, jak przekazać właściwej zdalny adres IP do mojego usługi zasobów podczas przechodzenia przez dwóch serwerów proxy (Apache + Zuul).
Czy ktoś może mi pomóc uzyskać dostęp do prawidłowego zdalnego adresu IP za tymi dwoma serwerami proxy lub zaproponować alternatywne podejście, aby to zadziałało?
Naprawiono w https://github.com/spring-cloud/spring-cloud-netflix/pull/952 – Tim