我们有一个Spring Boot (Spring MVC)应用程序,在Apache SSL代理后面的专用应用程序服务器上嵌入了Tomcat。
代理服务器上的SSL端口是4433,转发到应用程序服务器上的端口8080。
因此,指向代理服务器的URL转发方式如下:
https://proxyserver:4433/appname >>forward>> http://appserver:8080/
在没有代理的情况下运行时,发生的第一件事是
Spring Security重定向请求,如下所示:
http://appserver:8080/ >>redirect>> http://appserver:8080/login
要显示登录表单,请将WebSecurityConfigurerAdapter
扩展为
...
httpSecurity.formLogin().loginPage("/login") ...
...
它在没有代理的情况下工作得很好,但是有了代理,重定向需要改变,
因此Spring应该重定向到相应的代理URL,如下所示:
http://appserver:8080/ >>redirect>> https://proxyserver:4433/appname/login
但目前还没有成功。
我正在尝试应用这个解决方案:59.8 Use Tomcat behind a front-end proxy server
我们已经在Apache中配置了,并验证它是否发送了预期的报头:
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Host: proxyserver
X-Forwarded-Port: 4433
X-Forwarded-Proto: https
使用以下参数启动应用程序:
export ARG1='-Dserver.tomcat.protocol-header=x-forwarded-proto'
export ARG2='-Dserver.tomcat.remote-ip-header=x-forwarded-for'
java $ARG1 $ARG2 -jar webapp.jar
但是,重定向仍然不起作用。
它将一直在本地重定向到客户端不可用的http://appserver:8080/login
。
为了让这个场景工作,我们还需要做什么吗?
更新
此外,我还关心代理URL中的"/appname“部分。在应用程序服务器上,应用程序的根目录为"/“。在通过代理时,应该如何指示Spring将"/appname“包含在发送回客户端的所有URL中?
发布于 2015-05-14 18:06:40
在某种程度上,您的代理看起来很好,后端应用也是如此,但它似乎没有看到RemoteIpValve
修改的请求。RemoteIpValve
的默认行为包括代理IP地址的模式匹配(作为安全检查),并且它只修改它认为来自有效代理的请求。Spring Boot中的模式缺省为一组众所周知的内部IP地址,如10.*.*.*
和192.168.*.*
,因此如果您的代理不在其中一个上,您需要显式地配置它,例如
server.tomcat.internal-proxies=172\\.17\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}
(使用属性文件格式,这意味着您必须对反斜杠进行双重转义)。
如果您设置了以下内容,则可以查看RemoteIpValve
中正在发生的情况
logging.level.org.apache.catalina.valves.RemoteIpValve=DEBUG
或者在其中设置断点。
发布于 2014-08-24 17:26:39
这个问题的典型解决方案是让代理处理任何需要的重写。例如,在Apache中,您可以使用rewrite_module和/或headers_module来更正头。再举一个例子,Nginx在配置上游服务器后,会自动为您处理这种情况和其他类似的情况。
回应评论:
remote_ip_header和protocol_header spring boot的配置值是什么?
让我们暂时忘记Spring Boot。嵌入式servlet容器Tomcat提供了一个称为RemoteIpValve的阀门。这个阀门是Apache remotip_module的一个端口。这个阀门的主要目的是为了“授权和日志记录的目的”而将“发起请求的用户代理程序视为发起用户代理程序”。为了使用这个阀门,需要对其进行配置。
请查找有关此阀门here的更多信息。
Spring Boot通过server.tomcat.remote_ip_header和server.tomcat.protocol_header属性方便地支持通过application.properties配置该阀。
发布于 2020-03-06 16:16:33
您可以配置几个与此相关的属性。application.yaml
示例:
server:
forward-headers-strategy: native
tomcat:
use-relative-redirects: true
protocol-header: x-forwarded-proto
remote-ip-header: x-forwarded-for
设置server.forward-headers-strategy: native
将替换已弃用的server.use-forward-headers:true
https://stackoverflow.com/questions/25455969
复制相似问题