配置Spring Security 3.2后,_csrf.token
不会绑定请求或会话对象.
这是spring security配置:
它呈现下一个HTML:
结果是403 HTTP状态:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
更新 在一些调试之后,请求对象从DelegatingFilterProxy中获得良好的形式,但是在CoyoteAdapter的第469行中它执行request.recycle(); 删除所有属性......
我使用JDK 1.7在Tomcat 6.0.36,7.0.50中进行测试.
我没有理解这种行为,而不是,如果有人指出我使用与CSRF一起工作的Spring Security 3.2的应用程序样本战争的方向,那么这是可能的.
你不应该加入登录表单吗?
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
正如指出这里的春季安全文档中
试着改变这个:<csrf />
对此:<csrf disabled="true"/>
.它应该禁用csfr.
使用百里香叶,您可以添加:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
如果您将应用security ="none",则不会生成csrf令牌.页面不会通过安全筛选器.使用角色ANONYMOUS.
我没有详细介绍,但它对我有用.
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" /> <!-- you configuration --> </http>
看起来您的Spring应用程序中的CSRF(跨站点请求伪造)保护已启用.实际上它是默认启用的.
根据spring.io:
什么时候应该使用CSRF保护?我们的建议是对普通用户可以由浏览器处理的任何请求使用CSRF保护.如果您只创建非浏览器客户端使用的服务,则可能需要禁用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">
用于禁用csrf的Spring文档: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(); } }