使用Spring Security将https卸载到负载均衡器
现在,负载均衡器处理https,然后将该https传递到我的Web服务器。因此,对每个请求处理https都要加倍。我要做的是完全卸载https,这样我的Web服务器就不必处理它了。
在Web服务器认为所有请求都是http的情况下,如何配置Spring Security和JSP页面?显然,我必须修改<intercept-
url>配置的元素,使其requires-channel
属性始终为http
或any
。在我的JSP页面中,我必须在<c:url
value=''/>链接之前添加一个,${secureUrl}
并${nonSecureUrl}
取决于结果页面是https还是http。来自控制器的重定向也需要像这样修改…还有其他吗?
修改JSP页面中的所有链接以包括方案和主机也似乎很痛苦。有更好的方法吗?
回答:
如果您在负载平衡器处终止SSL,则您的负载平衡器应发送一个标头,指示最初请求的协议。例如,F5添加了X-Forwarded-Proto。
在这里,您可以创建ChannelProcessor
用于查看此标头而不是的custom
request.isSecure()
。然后,您可以继续使用<intercept-url requires-
channel="https">和相对<c:url>
。
步骤:
- 子类SecureChannelProcessor和InsecureChannelProcessor重写
decide()
。在decide()
检查您的负载平衡器发送的标头。
@Override public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException {
for (ConfigAttribute attribute : config) {
if (supports(attribute)) {
if (invocation.getHttpRequest().
getHeader("X-Forwarded-Proto").equals("http")) {
entryPoint.commence(invocation.getRequest(),
invocation.getResponse());
}
}
}
}
- 然后使用来在ChannelDecisionManagerImpl bean 上设置这些ChannelProcessor
BeanPostProcessor
。请参阅此Spring Security常见问题解答,以了解为什么/如何使用BeanPostProcessor
。
以上是 使用Spring Security将https卸载到负载均衡器 的全部内容, 来源链接: utcz.com/qa/401504.html