我有一个使用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请求,并禁止访问/sec/**
层次结构。
经过一些研究,我发现代理会添加一个X-Forwarded-Proto: https
头部(*),但是在Spring Security中使用HttpServletRequest.isSecure()
来确定提供的通道安全性(摘自SecureChannelProcessor
javadoc)。
我该如何告诉Spring Security一个X-Forwarded-Proto: https
头部就足以表示安全请求呢?
我知道我可以报告代理配置中的这一部分,但代理管理员真的不喜欢这个解决方案,因为有很多应用程序位于代理后面,配置可能变得无法管理。
我目前正在使用带有XML配置的Spring Security 3.2,但我准备接受基于Java配置和/或更高版本的答案。
(*) 当然,如果该头部存在于传入请求中,代理会将其删除,因此应用程序可以确信它。