grails - canal seguro spring-security-core que causa un bucle de redireccionamiento (en Heroku)

Estoy usando spring-security-core y he configurado las capacidades del canal seguro, que funcionan bien en mi máquina de desarrollo. Tengo lo siguiente en Config.groovy

grails.plugins.springsecurity.secureChannel.definition = [
   '/order/checkout': 'REQUIRES_SECURE_CHANNEL',
   '/order/paymentComplete': 'REQUIRES_INSECURE_CHANNEL'
]

Además, implementar en Heroku el procesamiento de pedidos asociado funciona bien, mientras tanto como comento las líneas anteriores. Tan pronto como los vuelvo a colocar, obtengo:

error de redirección

Veo que entran muchas solicitudes en el servidor y la vista de red de Firebug muestra:

redirigir vista de red

He añadido PiggyBack SSL a Heroku y puedo especificar una dirección https: // ... para navegar a otras partes del sitio, en cuyo caso el navegador permanece en modo SSL. Pero si accedo al

https:/www.momentumnow.co/order/checkout 

dirección directamente, obtengo el mismo problema de bucle de redireccionamiento. ¿Sabes cuál es el problema o cómo puedo depurarlo más? Si es lo último, ¿podría actualizar el área de comentarios y responderé con actualizaciones sobre el área del problema? Gracias

SSL de PiggyBack documentación indica:

"Piggyback SSL le permitirá utilizar https://yourapp.heroku.com, ya que utiliza la certificación * .heroku.com. No necesita comprar o configurar un certificado, simplemente funciona. https://yourcustomdomain.com funcionará, pero producirá una advertencia en el navegador ".

Probablemente cambie a otro modo cuando agregue un certificado, sin embargo, ese no parece ser el problema, según la declaración anterior.


En el servidor, obtengo:

enter image description here

preguntado el 01 de febrero de 12 a las 04:02

Hola Ray, ¿alguna vez obtuviste una respuesta a esto? Tengo un problema similar en Clojure en Heroku. -

Encontré una solución en este hilo: stackoverflow.com/questions/10137761/… -

2 Respuestas

Debe corregir los valores de los puertos, ya que están predeterminados en 8080 y 8443. Consulte la sección sobre seguridad del canal en los documentos: http://grails-plugins.github.com/grails-spring-security-core/docs/manual/ - acerca de grails.plugins.springsecurity.portMapper.httpPort y la grails.plugins.springsecurity.portMapper.httpsPort atributos de configuración.

Respondido 01 Feb 12, 09:02

Ah, maravilloso. Gracias por señalar el problema general (y también por mostrarme dónde encontrar la respuesta). Muy apreciado. Por separado, ¿puede decirme si debo continuar con Spring-Security-UI retirado (y agregar mi propio código de registro) para trabajar en Heroku? (este es el problema con los complementos utilizados por spring-security-ui aparentemente incompatibles con el complemento Heroku). Gracias. - Ray

Mmm. Busqué en Heroku la información del puerto SSL, no encontré ninguno, por lo que usé 80 para httpPort y 443 para httpsPort. Sigo recibiendo el mismo error (excepto que veo el puerto 443 en las solicitudes). Además, cuando solo lo hago web oficial, Puedo ver que el puerto remoto es 443 en los paquetes enviados de ida y vuelta, por lo que este parece ser el puerto correcto. - Ray

Para cualquier otra persona que se encuentre con esto (como yo), el problema es que su aplicación en realidad no recibe la solicitud como HTTPS. Más bien, Heroku reemplaza el HTTPS con un encabezado "X-Fordered-Proto". La redirección HTTPS de Spring-security lo pone en un ciclo de redireccionamiento infinito porque Siempre hay detecta la solicitud como HTTP.

Puedes escribir el tuyo SecureChannelProcessor para lidiar con esto:

public class HerokuSecureChannelProcessor extends SecureChannelProcessor {

    @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)) {
                String header = invocation.getHttpRequest().getHeader("X-Forwarded-Proto");
                if(header == null){
                    // proceed normally
                    if (!invocation.getHttpRequest().isSecure()) {
                        getEntryPoint().commence(invocation.getRequest(), invocation.getResponse());
                    }
                } else {
                    // use heroku header instead
                    if("http".equals(header)) {
                        getEntryPoint().commence(invocation.getRequest(), invocation.getResponse());
                    }
                }
            }
        }
    }
}

respondido 14 mar '14, 06:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.