我们正在将一个旧的 java/spring 应用程序移到 AWS 中,因此它位于 AWS 应用程序负载均衡器的后面。 Tomcat 直接在 8080 端口上的负载均衡器后面运行,我们在负载均衡器和 tomcat 之间使用 HTTP。
问题是在这种情况下,spring 安全模块无法识别连接是安全的。
我可以通过配置连接来解决这个问题:
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
proxyName="single-host.example.com"
secure="true"
scheme="https"
redirectPort="443"
proxyPort="443" />
这适用于单个主机名。但是,我需要它来跨多个主机名工作。
我已尝试跳过代理并添加:
server.tomcat.remote_ip_header=X-Forwarded-For
server.tomcat.protocol_header=X-Forwarded-Proto
但这似乎没有任何区别。
有没有办法在这种情况下支持多个主机名?
最佳答案
AWS LoadBalancer 发送 X-Forwarded-Proto代理请求时的 header 。
在 Tomcat 上配置 RemoteIpValve拥有request.secure以及从这些 header 解释的其他请求变量。
<Valve className="org.apache.catalina.valves.RemoteIpValve"/>
您还应该在 Connector
配置中省略设置 proxyName
,因为它应该自动来自 Valve。
关于java - 如何让 Spring Security 在跨多个域的负载均衡器后面工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45166572/