我有一个使用Spring Security保护的Spring MVC应用程序。大多数应用程序使用简单的HTTP来节省资源,但一小部分处理更多机密信息并需要HTTPS通道。
从security-config.xml
中提取:
<sec:http authentication-manager-ref="authenticationManager" ... >
...
<sec:intercept-url pattern="/sec/**" requires-channel="https"/>
<sec:intercept-url pattern="/**" requires-channel="http"/>
</sec:http>
在我们决定将其迁移到主服务器之前,一切都很好,在主服务器上,应用程序服务器在反向代理之后运行。现在HTTPS由反向代理处理,应用服务器只看到HTTP请求,不允许访问层次结构。
经过一些研究,我发现代理添加了一个X-Forwarded-Proto:https头(*),但在Spring Security中是HttpServletRequest。isSecure()用于确定提供的通道安全性(摘自SecureChannelProcessor)。
我如何告诉Spring Security一个X-Forwarded-Proto:https头足以满足安全请求?
我知道我可以在代理配置中报告这一部分,但代理管理员确实不喜欢这个解决方案,因为代理背后有许多应用程序,配置可能会发展到不可管理的状态。
我目前使用带有XML配置的Spring Security 3.2,但我已经准备好接受基于Java配置和/或更新版本的答案。
(*)当然,如果头存在于传入请求中,代理会删除它,因此应用程序可以对其充满信心。
如果您的站点是HTTPS,并且您正在另一个处理TLS终止的系统后面运行Apache Tomcat,那么您可以告诉Tomcat“假装”它正在处理TLS终止。
这会发出请求。isSecure()返回值真值
;
为此,您需要在server.xml
中向连接器配置添加安全="true"
。
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
另请参见scheme属性。
Spring Boot使其非常简单(至少在嵌入式Tomcat中)。
1、在应用程序中添加以下行。属性:
server.forward-headers-strategy=native
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
2、对您的HttpSecurity配置执行以下技巧。
// final HttpSecurity http = ...
// Probably it will be in your `WebSecurityConfigurerAdapter.configure()`
http.requiresChannel()
.anyRequest().requiresSecure()
源代码是Spring Boot参考指南
84.3在代理服务器后面运行时启用HTTPS
请检查下面的答案,了解与Spring Boot 2.2相关的详细信息
NeilMcGuigan的回答表明解决方案是servlet容器端。
Tomcat甚至更好。有一个阀门专门用于掩盖反向代理的副作用。Tomcat远程IP Valve留档摘录:
该阀门的另一个特点是用代理或负载均衡器通过请求标头(例如“X-Forwarded-Proto”)提供的方案替换明显的方案(超文本传输协议/https)、服务器端口和request.secure。
阀门配置示例:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto" />
这样,就不需要对应用程序本身进行其他配置,只需调用请求。如果请求包含一个标题字段,即X-Forwarded-Proto=https,则isSecure()
将返回true。
我曾考虑过另外两种可能性,但我更倾向于这种可能性:
ChannelProcessingFilter
之前活动的过滤器用HttpServletRequest estWrapper
覆盖isSecure()
来处理X-Forwarded-Proto
标头-需要编写和测试过滤器和包装器BeanPostProcess
查找ChannelProcessingFilter
并手动注入能够考虑X-Forwarded-Proto
标头的Channel决策管理器
-真的太低了我正在尝试使用2个docker容器设置一个基本模型(用于训练): 一个是nginx 一个是詹金斯 nginx被用作反向容器(下一步将是https前端)。詹金斯应该是公开的www.devportal.org:90/ci 我已经部分成功了。我的意思是我可以用给定的地址访问它。但是... > < li> 当我尝试与管理员用户连接时,出现登录页面。但是当填写用户/密码时,我被重定向到http://www.
我在服务器上安装了keycloak standanlone,并尝试通过Nginx在反向代理后面使用它。Keycloak绑定到127.0.0.1
我有一个RestHighLevelClient连接到一个远程elasticDB,它位于一个反向代理后面,该代理剥离了ssl。 当我打电话的时候 我得到一个握手失败的例外 正如这里和这里所描述的,我检查了日志,发现了ClientHello 服务员:你好 客户端和服务器都同意密码套件TLS_ECDHE_RSA_和_AES_128_GCM_SHA256 然后以加密和纯文本的形式跟踪请求。然后是另一个Cl
null 这起作用了,当调用https://www.website.com/auth/oauth/authorizeendpoint时,我将在https://www.website.com/auth/login上重定向,并看到我的登录表单。 问题是没有加载jquery或css这样的资源,因为它试图通过URL https://www.website.com/resources/jquery.min.
我是新来的Spring Security,并试图开发Spring Boot应用程序与谷歌登录使用OAuth2下运行的主机名: 8080。这个程序是背后的Apache反向代理服务器https://url.com. Spring启动版本2.1。0 Spring Security版本5.1.1 build.gradle: 应用yml: Spring Security配置: 我请求https://url.
我在谷歌上冲浪,没有找到任何具体的答案或例子,所以再次尝试我的运气在这里(经常是幸运的)。 问题所在 > 我在apache反向代理后面运行了一个spring boot RESTful服务。此RESTful服务只运行HTTP。假设它运行在本地IP172.S端口8080上。 我还配置了一个apache反向代理。假设它运行在本地IP172.a和公共IP55.a上。该代理响应两个端口80,但所有HTTP通