Spring Cloud Gateway POST prohibido con CSRF habilitado.
Quiero habilitar CSRF en Spring Cloud Gateway con webflux. Tengo una configuración mínima para eso, como se describe en el siguiente enlace:
https://docs.spring.io/spring-security/site/docs/5.2.x/reference/html/protection-against-exploits-2.html#webflux-csrf-configure
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
class WebSecurityConfiguration {
@Bean
SecurityWebFilterChain SecurityWebFilterChain(ServerHttpSecurity http) {
return http
.httpBasic().disable()
.formLogin().disable()
.oauth2Login().and()
.csrf().csrfTokenRepository(new CookieServerCsrfTokenRepository()).and()
.authorizeExchange()
.pathMatchers("/**").authenticated()
.and().build();
}
@ControllerAdvice
public class SecurityControllerAdvice {
@ModelAttribute
Mono<csrftoken> csrfToken(ServerWebExchange exchange) {
Mono<csrftoken> csrfToken = exchange.getAttribute(CsrfToken.class.getName());
return csrfToken.doOnSuccess(token -> exchange.getAttributes()
.put(CsrfRequestDataValueProcessor.DEFAULT_CSRF_ATTR_NAME, token));
}
}
Sin embargo, todavía obtengo un error 403 al hacer una solicitud POST con el siguiente mensaje en el cuerpo:
Se ha asociado un token CSRF a este cliente
¿Alguien puede ayudarme, por favor?
PD: En estas preguntas, el usuario ha deshabilitado CSRF donde también se produce el mismo error, pero necesito mantenerlo habilitado:
https://stackoverflow.com/questions/66721649/csrf-token-has-been-associated-to-this-client
https://stackoverflow.com/questions/60971877/spring-cloud-gateway-post-forbidden
davy.ai
Para solucionar el problema de obtener un error 403 en las solicitudes POST con el mensaje “CSRF Token has been associated to this client”, puedes intentar los siguientes pasos:
Asegúrate de que tu aplicación cliente esté enviando el token CSRF en la solicitud. Puedes comprobar esto inspeccionando las cabeceras de la solicitud y buscando una cabecera llamada “X-CSRF-TOKEN” o “X-XSRF-TOKEN”, dependiendo de tu configuración.
Si el cliente no está enviando el token CSRF, es posible que necesites modificar tu aplicación cliente para obtener el token e incluirlo en las cabeceras de la solicitud. Puedes utilizar el controlador de consejos proporcionado en el enlace que compartiste para exponer el token CSRF como un atributo de modelo en tus plantillas.
Si el cliente está enviando el token CSRF pero aún así obtiene un error 403, es posible que necesites comprobar si el token se está validando correctamente en el lado del servidor. Puedes utilizar herramientas de depuración para seguir el código y identificar cualquier problema con la validación del token CSRF. También puedes intentar desactivar temporalmente la protección CSRF para ver si el problema está relacionado con CSRF o con otra cosa.
En general, habilitar la protección CSRF en Spring Cloud Gateway con webflux requiere de alguna configuración y un manejo cuidadoso del token CSRF tanto en el lado del cliente como en el lado del servidor. Siguiendo los pasos anteriores y solucionando cualquier problema que surja, puedes asegurarte de que tu aplicación esté protegida contra ataques CSRF.