2011-05-25 14 views
5

Tengo una aplicación web que usa seguridad de primavera. Quiero redirigir al usuario a la misma página en la que estaba antes de cerrar la sesión cuando se desconecta.Seguridad de primavera: redirige a la URL anterior después de cerrar sesión.

¿Hay una manera fácil de hacer esto?

+0

¿Estás seguro también quiere esto? Si el usuario está visitando una página segura, ¿quiere que se le permita acceder a esa página segura después de cerrar la sesión? –

+0

@Vijay puede estar como invitado –

+1

Principalmente quiero que se envíen de vuelta a la pantalla de inicio de sesión. La página de inicio de sesión los envía a la página solicitada originalmente una vez que han iniciado sesión exitosamente y quiero que sea desde donde cerraron sesión. –

Respuesta

1

Puede añadir un nuevo filtro en la cadena de filtros de la seguridad del muelle. Ese nuevo archivador se aplicará a la URL /logout. Al pasar por este filtro, puede guardar la página actual en una variable de campo. Y al regresar a través del filtro. Puede redirigir la solicitud a la URL guardada. Creo que esto puede ayudar. Puede obtener la URL de la página actual usando. Referer encabezado en el objeto Request.

0

Es sólo una idea:

¿Qué tal si mantenemos una pila de páginas visitadas. puede estar en un máximo de 3 entradas. y redirige al usuario desde el cierre de sesión.

  • configurar un filtro o extender filtro de seguridad de resorte para mantener una pila en la sesión sobre dos últimas URL visitadas

  • al cerrar la sesión configurar un servlet como logout-success-url.

  • Ahora obtener la URL de la pila de sesión y ahora invalidar la sesión y redirigir el usuario a esa página

También se puede hacer uso de referrer header como Vijay ha mencionado

7

No estoy seguro de a qué versión de Spring se estaba refiriendo esta pregunta, pero existe una propiedad useReferer en la norma org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler desde Spring 3.0.

Así que todo lo que necesita hacer es configurarlo como este y el cierre de sesión volverá a dirigir a donde vino el usuario:

<bean id="logoutSuccessHandler" class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler"> 
    <property name="useReferer" value="true"/> 
</bean> 

<security:http> 
    <security:logout logout-url="/logout" success-handler-ref="logoutSuccessHandler" /> 
</security:http> 
+0

Lo usé y funciona bien. Sin embargo, cuando cierro la sesión de la página segura va al formulario de inicio de sesión ... ¿hay alguna manera de ir a URL diferente en este caso? (es decir, página de inicio) – Mat

+0

No creo que sea posible con el SimpleUrlLogoutSuccessHandler estándar. Puede ampliarlo y anular el método 'determineTargetUrl (solicitud HttpServletRequest, respuesta HttpServletResponse)' para implementar un comportamiento personalizado. Pero necesitaría saber si la URL (según lo determinado por 'super.determineTargetUrl (solicitud, respuesta);') a la que se está redireccionando está protegida ... No encontré otra manera de hacerlo que no sea comprobar la cadena targetUrl. ahí. – meyertee

0

Lo que necesita es un LogoutSuccessHandler simple

@Component 
    public class CustomLogoutSuccessHandler extends 
    SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler { 

@Override 
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse 
    response, Authentication authentication) 
     throws IOException, ServletException { 
    if (authentication != null) { 
     System.out.println(authentication.getName()); 
    } 
    response.setStatus(HttpStatus.OK.value()); 
    response.sendRedirect(request.getHeader("referer")); 
} 

Y más tarde llámelo en su método de configuración, es decir,

.logout().logoutSuccessHandler(customLogoutSuccessHandler) 

Esto lo redireccionará a la URL del remitente.

Cuestiones relacionadas