spring security - disable - No se pudo verificar el token CSRF proporcionado porque su sesión no se encontró en la seguridad de primavera
spring security rest token authentication (4)
De acuerdo con spring.io:
¿Cuándo debería usar la protección CSRF? Nuestra recomendación es usar protección CSRF para cualquier solicitud que pueda ser procesada por un navegador por usuarios normales. Si solo está creando un servicio que es utilizado por clientes que no pertenecen al navegador, es probable que desee desactivar la protección CSRF.
Entonces para deshabilitarlo:
@Configuration
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
Nota: la protección CSRF está habilitada de forma predeterminada con la configuración de Java
Estoy usando la seguridad de primavera junto con la configuración de Java
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/*").hasRole("ADMIN")
.and()
.addFilterAfter(new CsrfTokenResponseHeaderBindingFilter(), CsrfFilter.class)
.exceptionHandling()
.authenticationEntryPoint(restAuthenticationEntryPoint)
.and()
.formLogin()
.successHandler(authenticationSuccessHandler)
.failureHandler(new SimpleUrlAuthenticationFailureHandler());
Estoy usando PostMan para probar mis servicios REST. Obtengo ''csrf token'' con éxito y puedo iniciar sesión usando X-CSRF-TOKEN
en el encabezado de solicitud. Pero después del inicio de sesión cuando pulso la solicitud de publicación (incluyo el mismo token en el encabezado de solicitud que utilicé para la solicitud de entrada) obtengo el siguiente mensaje de error:
Estado HTTP 403: no se pudo verificar el token CSRF proporcionado porque no se encontró su sesión.
¿Alguien puede guiarme por lo que estoy haciendo mal?
Deshabilitar la protección CSRF es una mala idea.
Spring generará automáticamente un nuevo token CSRF después de cada solicitud, y deberá incluirlo en todas las solicitudes HTTP con efectos secundarios (PUT, POST, PATCH, DELETE).
En Postman puede usar una prueba en cada solicitud para almacenar el token CSRF en un CookieCsrfTokenRepository
global, por ejemplo, al utilizar CookieCsrfTokenRepository
pm.globals.set("xsrf-token", postman.getResponseCookie("XSRF-TOKEN").value);
Y luego incluirlo como encabezado con la clave X-XSRF-TOKEN
y el valor {{xsrf-token}}
.
Lo he solucionado agregando el último atributo en mi página de inicio de sesión, tal vez te haga un favor.
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false"%>
intente esto: @Override protected boolean sameOriginDisabled() { return true;}
@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
...
// Determines if a CSRF token is required for connecting. This protects against remote
// sites from connecting to the application and being able to read/write data over the
// connection. The default is false (the token is required).
@Override
protected boolean sameOriginDisabled() {
return true;
}
}
fuente: seguridad de WebSocket: deshabilitar CSRF dentro de WebSockets