从Spring Security文档
默认情况下,使用Java配置会启用CSRF保护。如果要禁用CSRF,则可以在下面看到相应的Java配置。有关如何配置CSRF保护的更多自定义信息,请参考csrf()的Javadoc。
并且,启用CSRF保护后
最后一步是确保在所有PATCH,POST,PUT和DELETE方法中都包含CSRF令牌。
在您的情况下:
- 您默认情况下启用了CSRF保护(因为您使用的是Java配置),
- 您正在使用HTTP POST提交登录表单,并且
- 在登录表单中不包含CSRF令牌。因此,您的登录请求在提交时被拒绝,因为CSRF保护筛选器无法在传入请求中找到CSRF令牌。
您已经确定了可能的解决方案:
- 禁用CSRF保护为
http.csrf().disable()
;要么 - 在登录表单中包含CSRF令牌作为隐藏参数。
由于您正在使用Thymeleaf,因此您将必须在登录页面的HTML模板中执行以下操作:
<form name="f" th:action="@{/login}" method="post"> <fieldset> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> ... </fieldset></form>请注意,您必须使用 th:action
HTML而不是HTML, action
因为Thymeleaf
CSRF处理器只会在前者中起作用。
您可以将表单提交方法更改为
GET仅解决问题,但是不建议这样做,因为用户将要在表单中提交敏感信息。
我通常创建一个Thymeleaf片段,然后在所有带有表单的页面中使用该片段,以生成包含CSRF令牌的表单标记。这减少了整个应用程序的样板代码。
使用
@EnableWebMvcSecurity代替
@EnableWebSecurity启用带有Thymeleaf标签的CSRF令牌自动注入。还可以
<formth:action>代替
<form action>Spring 3.2+和Thymeleaf
2.1+使用,以强制Thymeleaf自动将CSRF令牌包括为隐藏字段(来源Spring
JIRA)。



