在请求参数“_csrf”或头部“X-CSRF-TOKEN”上find无效的CSRF令牌'null'

configurationSpring Security 3.2后, _csrf.token不绑定到请求或会话对象。

这是弹簧安全configuration:

 <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> 

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&ntilde;a :</label> <input type="password" name="j_password" id="p" class="" onfocus="vc_psfocus = 1;" value=""> </span> </form> 

它呈现下一个html:

 <input type="hidden" name="" value="" /> 

结果是403 HTTP状态:

 Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'. 

更新经过一些debugging后,请求对象从DelegateFilterProxy中取出,但在CoyoteAdapter的第469行中,它执行request.recycle(); 删除所有属性…

我使用JDK 1.7在Tomcat 6.0.36,7.0.50中进行testing。

我还没有理解这种行为,而不是这样,如果有人指出我和Spring Security 3.2在一些应用程序的示例性战争的方向上,那么CSRF就是可行的。

看起来您的Spring应用程序中的CSRF(跨站点请求伪造)保护已启用。 其实它是默认启用的。

据spring.io介绍 :

什么时候应该使用CSRF保护? 我们的build议是对于普通用户可以通过浏览器处理的任何请求使用CSRF保护。 如果您只创build非浏览器客户端使用的服务,则可能需要禁用CSRF保护。

所以要禁用它:

 @Configuration public class RestSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } } 

如果你想要保持CSRF保护,那么你必须在你的表单中包含csrftoken 。 你可以这样做:

 <form .... > ....other fields here.... <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> </form> 

您甚至可以在表单的操作中包含CSRF令牌:

 <form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data"> 

你不应该添加到login表单吗?

 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 

正如在这里的春季安全文档中所述

如果您将应用安全性=“无”,则不会生成csrf标记。 页面不会通过安全filter。 使用angular色ANONYMOUS。

我没有详细介绍,但是它为我工作。

  <http auto-config="true" use-expressions="true"> <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" /> <!-- you configuration --> </http> 

尝试改变: <csrf />为: <csrf disabled="true"/> 。 它应该禁用csfr。

我曾经有同样的问题。

你的configuration使用security =“none”,所以不能生成_csrf:

 <http pattern="/login.jsp" security="none"/> 

你可以设置访问=“IS_AUTHENTICATED_ANONYMOUSLY”页面/login.jspreplace上面的configuration:

 <http> <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <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> 

加上百里香,你可以补充:

 <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> 

请在Github上查看我的工作示例应用程序,并与您的设置进行比较。

我认为csrf只适用于spring的forms

 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

改变form:form标签,看到它的作品。

Spring文档禁用csrf: https ://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure

 @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } } 

在您的控制器中添加以下内容:

 @RequestParam(value = "_csrf", required = false) String csrf 

并在jsp页面上添加

 <form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}