es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo cerrar sesión correctamente en un proyecto Vaadin Fusion 22 sin estado con oauth2.

Configuré un proyecto para que sea sin estado de acuerdo con esta documentación https://vaadin.com/docs/latest/fusion/security/spring-stateless

Configuración de autorización a través de Keycloak:

@Override
protected void configure(HttpSecurity http) throws Exception {
// Establece la política de seguridad predeterminada que permite las solicitudes internas de Vaadin y deniega todo lo demás
super.configure(http);

http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);

http
// Habilita el inicio de sesión de OAuth2
.oauth2Login(oauth2Login -> oauth2Login.clientRegistrationRepository(clientRegistrationRepository)
.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint
// Use un autoridades de asignación personalizada para obtener los roles del proveedor de identidad
// en el token de autenticación
.userAuthoritiesMapper(authoritiesMapper))
// Use un controlador de éxito de autenticación consciente de Vaadin
.successHandler(new VaadinSavedRequestAwareAuthenticationSuccessHandler()))
// Configura el cierre de sesión
.logout(logout -> logout
.logoutSuccessHandler(logoutSuccessHandler())

    .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET")));

setStatelessAuthentication(http,
new SecretKeySpec(Base64.getDecoder().decode(authSecret),
JwsAlgorithms.HS256),
"com.my.app");

}

private OidcClientInitiatedLogoutSuccessHandler logoutSuccessHandler() {
OidcClientInitiatedLogoutSuccessHandler logoutSuccessHandler = new
OidcClientInitiatedLogoutSuccessHandler(
clientRegistrationRepository);
logoutSuccessHandler.setPostLogoutRedirectUri("{baseUrl}/");
return logoutSuccessHandler;
}

La autenticación funciona correctamente, podemos ver los tokens jwt en las cookies https://i.stack.imgur.com/8cShO.png

Pero cuando hago clic en el botón de cierre de sesión, todavía estoy conectado.
Hay una función de cierre de sesión como se describe aquí https://vaadin.com/docs/latest/fusion/security/authentication-offline/#removing-an-expired-authentication

export async function logout() {
setSessionExpired();
await logoutImpl();
appStore.clearUserInfo();
location.href = '/logout';
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con la función de cierre de sesión en proyecto Vaadin Fusion configurado para ser sin estado

    Soy un experto en informática especializado en Vaadin, Vaadin-Fusion, Vaadin22 y Hilla. Según la documentación proporcionada en https://vaadin.com/docs/latest/fusion/security/spring-stateless, he configurado un proyecto Vaadin Fusion para que sea sin estado. El proyecto también está autorizado con Keycloak.

    La autenticación ha estado funcionando bien y puedo ver los tokens JWT en las cookies, pero cuando hago clic en el botón de cierre de sesión, sigo conectado. Parece haber un problema con la función de cierre de sesión.

    La documentación en https://vaadin.com/docs/latest/fusion/security/authentication-offline/#removing-an-expired-authentication explica cómo eliminar una autenticación expirada. Sugiero probar el siguiente código para rectificar el problema:

    export async function logout() {
          setSessionExpired();
          await logoutImpl();
          appStore.clearUserInfo();
          location.href = '/logout';
    }
    

    Por favor, pruebe el código anterior y verifique si se resuelve el problema.

Comments are closed.