2011-07-18 16 views
7

Estamos utilizando un dispositivo F5 BIG-IP para terminar las conexiones SSL y conectar mediante HTTP simple al servidor de aplicaciones con una aplicación activada por resorte. También configuramos F5 para enviar un encabezado X-Forwarded-Proto con http o https como valor.Spring Security: requires-channel = "https" detrás del acelerador SSL

Ahora nos gustaría hacer cumplir HTTPS mediante la configuración de una dirección URL de intercepción:

<security:intercept-url pattern="/login.action" requires-channel="https" /> 

Pero esto sólo funciona si el esquema de protocolo en el containter servlet es HTTPS, por lo que necesitamos para interpretar la cabecera HTTP.

¿Alguna idea de cómo hacer esto?

Gracias Simon

Respuesta

8

Subclase SecureChannelProcessor y InsecureChannelProcessor anulando decide(). Tendrá que copiar y pegar un código, por ejemplo para 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()); 
       } 
      } 
     } 
    } 

asentando después estos ChannelProcessors en el ChannelDecisionManagerImpl frijol utilizando un BeanPostProcessor.

1

Sé que esta pregunta/respuesta tiene 4 años, pero me ayuda a encontrar la solución a mi problema. Pero en las aplicaciones modernas de Spring Boot, la solución es más fácil. Sólo tiene que añadir la siguiente entrada en el application.yaml:

server.tomcat.protocol_header: x-forwarded-proto

información Mor aquí: http://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https

+1

He intentado esto, pero sólo parece funcionar si está utilizando la instancia Tomcat incluido, y no implementar una aplicación como una guerra en una instancia de Tomcat externa. –