2012-04-30 30 views
31

Tengo una aplicación web Spring, asegurada con Spring Security, que se ejecuta en EC2. Delante de la instancia EC2 hay un Elastic Load Balancer con un certificado SSL (https termina en el balanceador de carga, es decir, el puerto 443 -> puerto 80), por lo que desde la perspectiva de Tomcat, las solicitudes entrantes son HTTP.Inicio de sesión HTTPS con redireccionamientos de Spring Security a HTTP

Mi formulario de ingreso se envía a https, sin embargo, el redireccionamiento posterior pasa a http (éxito o fracaso). La autenticación se ha realizado correctamente, y que pueda volver a https y estoy conectado

Mi configuración de inicio de sesión se ve así:.

<security:form-login 
    default-target-url="/home" 
    login-page="/" 
    login-processing-url="/processlogin" 
    authentication-failure-url="/?login_error=1"/> 

¿Qué necesito cambiar para hacer default-meta-url y autenticación-falla-url ir a https?

  • Tomcat 6
  • Spring Security 3.0.x
+0

He configurado una reescritura de Apache mientras tanto, pero todavía tengo curiosidad si hay una forma de hacerlo con la configuración de Spring Security. – Thody

+0

por lo general se realiza en el equilibrador de carga y la configuración se llama url-rewrite. De esta forma, el equilibrador de carga se asegura de que la redirección permanezca en https. – Ritesh

Respuesta

1

Una forma conseguí este trabajo es mediante la adición de la siguiente configuración

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" > 
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" /> 
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" /> 
    ... 
</http> 

tuvo que añadir always-use-default-target="true" y default-target-url="https://....". No es la forma ideal, ya que necesitas codificar la url en la configuración.

0

Configuré requires-channel = "any" en todas las URL de intercepción. Esto permite que siga funcionando en mi entorno de desarrollo donde no utilizo SSL.

<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/> 
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> 
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/> 

A continuación, cree un host virtual de apache que redirija todo el tráfico a la versión de HTTPS.

<VirtualHost *:80> 
    ServerName www.mywebsite.com 
    Redirect permanent/https://www.mywebsite.com/ 
</VirtualHost> 
+5

Después de iniciar sesión, Spring enviará un encabezado de ubicación con una dirección http. El usuario no se dará cuenta, porque su apache lo redirigirá instantáneamente a https nuevamente, pero sigue siendo un problema de seguridad grave, ya que el navegador enviará las cookies de sesión a través de un canal no seguro. – marcelj

+0

@marcelj - Acabo de ejecutarlo a través de Firebug y estás en lo cierto. Trataré de encontrar una solución mejor y revisaré mi respuesta si lo hago. –

+0

@marcelj, ¿podría explicar por qué este es un riesgo de seguridad grave o proporcionar una referencia que describa el riesgo? –

19

La configuración del resorte debe ser independiente del protocolo utilizado. Si utiliza algo como "requiere canal", tarde o temprano tendrá problemas, especialmente si desea implementar la misma aplicación en un entorno de desarrollo sin https.

En su lugar, considere configurar su tomcat correctamente. Puede hacer esto con RemoteIpValve. Dependiendo de las cabeceras del equilibrador de carga envía, la configuración server.xml debe contener algo como esto:

<Valve 
    className="org.apache.catalina.valves.RemoteIpValve" 
    internalProxies=".*" 
    protocolHeader="X-Forwarded-Proto" 
    httpsServerPort="443" 
    /> 

primavera determinará la dirección de redirección absoluta basada en la ServletRequest, por lo que cambiar el httpsServerPort si está utilizando algo más que 443:

el httpsServerPort es el puerto devuelto por ServletRequest.getServerPort() cuando el protocolHeader indica https protocolo

0

También estoy enfrentando exactamente el mismo problema y hasta el momento en que obtengo la solución adecuada, estoy redirigiendo mis solicitudes del servidor proxy al servidor tomcat sobre AJP en lugar de HTTP. A continuación es mi configuración de Apache

ProxyPass /myproject ajp://localhost:8009/myproject 
ProxyPassReverse /myproject ajp://localhost:8009/myproject 
0

utilizar por debajo de líneas de código en la web.xml

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Login and Restricted Space URLs</web-resource-name> 
    <url-pattern>/j_security_check</url-pattern> 
    <url-pattern>/loginpage.rose</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

obliga a utilizar HTTPS.

Cuestiones relacionadas