我们正在使用F5 BIG-IP设备来终止SSL连接,并通过普通的HTTP连接到具有启用弹簧的应用程序的应用程序服务器。我们还配置F5发送一个X-Forwarded-Proto标头,其中http或https为值。
现在我们想通过配置拦截网址来强制执行HTTPS:
<security:intercept-url pattern="/login.action" requires-channel="https" />
但是这只有在servlet containter中的协议方案是HTTPS时才有效,所以我们需要解释HTTP头。
知道怎么做吗?
由于 西蒙
答案 0 :(得分:8)
子类SecureChannelProcessor和InsecureChannelProcessor覆盖decide()
。您需要复制并粘贴一些代码,例如Secure:
@Override
public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException {
Assert.isTrue((invocation != null) && (config != null),
"Nulls cannot be provided");
for (ConfigAttribute attribute : config) {
if (supports(attribute)) {
if (invocation.getHttpRequest().
getHeader("X-Forwarded-Proto").equals("http")) {
entryPoint.commence(invocation.getRequest(),
invocation.getResponse());
}
}
}
}
然后使用BeanPostProcessor在ChannelDecisionManagerImpl bean上设置这些ChannelProcessors。
答案 1 :(得分:0)
我知道这个问题/答案是4岁,但它帮助我找到问题的解决方案。但在现代Spring Boot应用程序中,修复更容易。只需在application.yaml
中添加以下条目:
server.tomcat.protocol_header: x-forwarded-proto
此处提供的信息:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https
答案 2 :(得分:0)
现在更简单:
server.use-forward-headers: true
默认情况下为Cloud Foundry和Heroku启用,但不支持其他用户,例如AWS。
文档(第73.7节):https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/howto-embedded-servlet-containers.html