Después de configurar Spring Security 3.2, _csrf.token
no está vinculado a una solicitud o un objeto de sesión.
Esta es la configuración de seguridad de primavera:
<http pattern="/login.jsp" security="none"/>
<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER/>
</user-service>
</authentication-provider>
</authentication-manager>
El archivo login.jsp
<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<button id="ingresarButton"
name="submit"
type="submit"
class="right"
style="margin-right: 10px;">Ingresar</button>
<span>
<label for="usuario">Usuario :</label>
<input type="text" name="j_username" id="u" class="" value=''/>
</span>
<span>
<label for="clave">Contraseña :</label>
<input type="password"
name="j_password"
id="p"
class=""
onfocus="vc_psfocus = 1;"
value="">
</span>
</form>
Y muestra el siguiente html:
<input type="hidden" name="" value="" />
El resultado es el estado HTTP 403:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
ACTUALIZACIÓN Después de una depuración, el objeto de solicitud sale bien de DelegatingFilterProxy, pero en la línea 469 de CoyoteAdapter ejecuta request.recycle (); que borra todos los atributos ...
Pruebo en Tomcat 6.0.36, 7.0.50 con JDK 1.7.
No he entendido este comportamiento, en lugar de, sería posible si alguien me indicara alguna guerra de muestra de aplicación con Spring Security 3.2 que funciona con CSRF.
spring
spring-security
csrf
csrf-protection
Hugo Robayo
fuente
fuente
spring-security.xml
) con Spring 4.0.0 RELEASE (GA), Spring Security 3.2.0 RELEASE (GA) (aunque está integrado con Struts 2.3.16. No le di un intente con Spring MVC solo). Sin embargo, falla cuando la solicitud es de varias partes para cargar archivos con el estado 403. Estoy luchando por encontrar una solución.web.xml
es crucial.MultipartFilter
debe declararse antesspringSecurityFilterChain
. Espero que ayude. Gracias.Respuestas:
Parece que la protección CSRF (Cross Site Request Forgery) en su aplicación Spring está habilitada. En realidad está habilitado por defecto.
Según spring.io :
Entonces, para deshabilitarlo:
Sin embargo, si desea mantener habilitada la protección CSRF, debe incluir en su formulario el
csrftoken
. Puedes hacerlo así:Incluso puede incluir el token CSRF en la acción del formulario:
fuente
.csrf().ignoringAntMatchers("/h2-console/**")
¿No debería agregar al formulario de inicio de sesión ?;
Como se indica aquí en la documentación de seguridad de Spring
fuente
Si aplica
security="none"
, no se generará ningún token csrf. La página no pasará por el filtro de seguridad. Utilice el rol ANÓNIMO.No he entrado en detalles, pero me está funcionando.
fuente
Trate de cambiar esta situación:
<csrf />
a esto:<csrf disabled="true"/>
. Debería deshabilitar csfr.fuente
Con la hoja de tomillo puedes agregar:
fuente
Documentación de Spring para deshabilitar csrf: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
fuente
Yo solia tener el mismo problema.
Su configuración usa security = "none", por lo que no puede generar _csrf:
puede configurar access = "IS_AUTHENTICATED_ANONYMOUSLY" para la página /login.jsp reemplazar la configuración anterior:
fuente
creo que csrf solo funciona con formas de resorte
cambie a
form:form
etiqueta y vea que funciona.fuente
Consulte mi aplicación de muestra de trabajo en Github y compárela con su configuración.
fuente
Ninguna de las soluciones funcionó para mí. El único que funcionó para mí en forma de primavera es:
action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"
REEMPLAZADAS CON:
action = "./ upload? _csrf = $ {_ csrf.token}"
(Spring 5 con csrf habilitado en la configuración de java)
fuente
En su controlador agregue lo siguiente:
Y en la página jsp agregue
fuente