java - combination - spring boot add ssl certificate
Spring SecurityContextHolder.getContext(). GetAuthentication() devuelve null después de que se utiliza RedirectView en HTTPS/SSL (1)
Tengo un típico Spring MVC corriendo en Tomcat. Después de cambiar el sistema para que se ejecute en HTTPS (todo funciona correctamente en HTTP plano), el inicio de sesión dejó de funcionar. El motivo es que el objeto SecurityContextHolder.getContext().getAuthentication()
vuelve null
después de usar RedirectView
.
Ya busqué la respuesta, la única que encontré sugerida para establecer la propiedad redirectHttp10Compatible
viewResolver
a false
en la configuración viewResolver
bean. Esto no ayudó.
También verifiqué que a lo largo de la redirección, mi ID de sesión sigue siendo la misma y la conexión permanece segura, es decir, no es un problema (al menos hasta donde pude ver) de un cambio entre http y https o viceversa.
¿Cual podría ser el problema?
<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<http auto-config="true">
<intercept-url pattern="/**" requires-channel="https" />
<intercept-url pattern="/index*" access="ROLE_USER"/>
<intercept-url pattern="/dashboard*" access="ROLE_USER" requires-channel="https"/>
<intercept-url pattern="/login*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
<intercept-url pattern="/signin*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
<intercept-url pattern="/signup*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
<form-login login-page="/home"
default-target-url="/home"
authentication-failure-url="/home?authentication_error=true"
authentication-success-handler-ref="redefineTargetURL"
/>
<anonymous username="guest" granted-authority="ROLE_GUEST" key="anonymousKey"/>
<logout invalidate-session="true" logout-success-url="/logout?message=Logout Successful" />
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userDetailsService" />
</authentication-manager>
<beans:bean id="redefineTargetURL" class="com.groupskeed.common.RedefineTargetURL" />
<beans:bean id="userDetailsService" class="com.groupskeed.security.UserDetailsServiceImpl" />
El SecurityContextHolder.getContext().getAuthentication()
vuelve nulo después de que el redireccionamiento es correcto, ya que está enfadado. Pero debe ser repoblado de la sesión. Por lo tanto, intente realizar un seguimiento del atributo SPRING_SECURITY_CONTEXT
en la sesión. Aquí hay un código de ejemplo para tener una idea:
HttpSession session = request.getSession(true);
System.out.println(session.getAttribute("SPRING_SECURITY_CONTEXT"));
En la documentación de Spring Security hay una Parte sobre cómo la conmutación HTTPS / HTTP puede arruinar la sesión, tal vez hay una pista para su problema en algún lugar allí. http://static.springsource.org/spring-security/site/faq.html#d0e223
Las preguntas frecuentes anteriores conducen a un examen de cómo se maneja la sesión en su aplicación. Probablemente comenzaría a buscar en la implementación AuthenticationSuccessHandler. (Puede psot en su pregunta si lo desea).
Para obtener más detalles sobre cómo se maneja el contexto de seguridad en las aplicaciones web, consulte lo siguiente: (sección 5.4): http://static.springsource.org/spring-security/site/docs/3.0.x/reference/technical-overview. html