Spring Security:SSL加速器后面的requires-channel =“https”

时间:2011-07-18 11:50:35

标签: ssl spring-security accelerator

我们正在使用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头。

知道怎么做吗?

由于 西蒙

3 个答案:

答案 0 :(得分:8)

子类SecureChannelProcessorInsecureChannelProcessor覆盖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