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=$("
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.