Saltar al contenido

El cierre de sesión de Spring Security no funciona: no borra el contexto de seguridad y el usuario autenticado aún existe

Este grupo de expertos pasados muchos días de trabajo y de recopilar de información, dieron con los datos necesarios, esperamos que te sea de gran utilidad en tu proyecto.

Solución:

De su pregunta, veo que está tratando de crear su propio cierre de sesión y también está tratando de usar el cierre de sesión de primavera predeterminado. Le aconsejo que elija un método solo que no mixed ambos. Hay dos formas en las que puedo mostrarte cómo cerrar la sesión desde Spring:

Primero: cierre de sesión de seguridad de primavera predeterminado

.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/logout.done").deleteCookies("JSESSIONID")
.invalidateHttpSession(true) 

Del ejemplo anterior, solo debe llamar al /logout url cada vez que desee cerrar la sesión del usuario. No es necesario crear ninguna @Controller para manejar ese cierre de sesión en su lugar, Spring ayudará a cerrar la sesión del usuario. También puede agregar otra cosa que desee invalidar aquí.

Segundo: cierre de sesión programáticamente

@RequestMapping(value = "/logout", method = RequestMethod.POST)
public String logoutDo(HttpServletRequest request,HttpServletResponse response)
HttpSession session= request.getSession(false);
    SecurityContextHolder.clearContext();
         session= request.getSession(false);
        if(session != null) 
            session.invalidate();
        
        for(Cookie cookie : request.getCookies()) 
            cookie.setMaxAge(0);
        

    return "logout";

Si está utilizando este cierre de sesión, no necesita incluir el primer método en la configuración de seguridad de primavera. Al usar este método, puede agregar una acción adicional para hacer antes y después de cerrar sesión. Por cierto, para usar este cierre de sesión, simplemente llame al /logout La URL y el usuario se cerrarán manualmente. Este método invalidará la sesión, borrará el contexto de seguridad de Spring y las cookies.

Además para el segundo método, si está utilizando RequestMethod.POST, necesitas incluir el csrf key como publicación La forma alternativa es crear un formulario con entrada oculta csrf key. Este es un ejemplo de enlace de cierre de sesión generado automáticamente con jquery:

$("#Logout").click(function()
    $form=$("
").attr("action":"$pageContext.request.contextPath"+"/logout","method":"post") .append($("").attr("type":"hidden","name":"$_csrf.parameterName","value":"$_csrf.token")) $("#Logout").append($form); $form.submit(); );

Solo necesita crear un hipervínculo Logout para usarlo

Si estás usando RequestMethod.GET, solo incluye un csrf key como un parámetro en tu enlace como este:

Logout

Eso es todo, espero su ayuda.

Esto ayudará, creo que clearAuthentication(true) es suficiente:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {

....

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
        .httpBasic()
        .and()
        .logout().clearAuthentication(true)
        .logoutSuccessUrl("/")
        .deleteCookies("JSESSIONID")
        .invalidateHttpSession(true)
        .and()

Solo un aviso, hay un encabezado HTTP Borrar datos del sitio como se muestra a continuación

Clear-Site-Data: "cache", "cookies", "storage", "executionContexts"

También ayudé a agregar soporte para Clear-Site-Data encabezado en Spring-Security 5.2 proyecto. Para obtener más detalles sobre la implementación, consulte el PR.

Aquí hay una muestra de cómo va a funcionar.

@EnableWebSecurity
static class HttpLogoutConfig extends WebSecurityConfigurerAdapter 
        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
                .logout()
                    .addLogoutHandler(new HeaderWriterLogoutHandler(
                           new ClearSiteDataHeaderWriter(SOURCE)));
    

Donde FUENTE es un vararg de uno o más de los siguientes

  • "*" borrar todo
  • Uno o más de "cache", "cookies", "storage", "executionContexts"

Para obtener más detalles, consulte la prueba de muestra en LogoutConfigurerClearSiteDataTests.java.

Si para ti ha sido provechoso este artículo, sería de mucha ayuda si lo compartieras con otros programadores así nos ayudas a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *