使用Spring Boot + Thymeleaf + Spring Security它可以解决这个问题:
security.enable-csrf=true
的 2017年3月30日更新 强> :
一 的 重要 强> 事情是:在你的表单中使用th:action,这将告诉Spring Security在表单中注入CSRF而无需手动插入。
手动插入:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
的 更新于25/01/2017 强> :
<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity4</artifactId> <version>2.1.2.RELEASE</version> </dependency>
根据 Thymeleaf 开发商, RequestDataValueProcessor Thymeleaf使用interface来查找额外隐藏的字段,这些字段会自动添加到表单后面。
Thymeleaf
RequestDataValueProcessor
下面的代码在 org/thymeleaf/spring3/processor/attr/SpringActionAttrProcessor.java 显示了这个。
org/thymeleaf/spring3/processor/attr/SpringActionAttrProcessor.java
final Map<String,String> extraHiddenFields = RequestDataValueProcessorUtils.getExtraHiddenFields(arguments.getConfiguration(), arguments);
排序问题,并自动添加CSRF令牌;在您的应用程序中创建自定义请求数据值处理器并使用spring注册它。为此,您可以阅读以下教程。
Spring-MVC中的Csrf防御
我还建议您在没有弹簧引导的情况下检查以前的Spring MVC代码,以确认项目的配置XML是否已定制 RequestDataValueProcessor 或不。
我有一个类似的问题。经过一些调查后我发现只有使用'th:action'属性(不是普通的'action')的表单才会注入csrf标记。 对于登录表单,您似乎需要手动注入csrf( 链接 )。 在官方春季文档中( 链接 )有一个建议是在登录表单提交之前检索csrf令牌以防止会话超时。在这种情况下,表单上的隐藏输入中不会有csrf标记。
你必须做两件事。声明一个bean
@Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { ... other beans ... @Bean public RequestDataValueProcessor requestDataValueProcessor() { return new CsrfRequestDataValueProcessor(); } }
确保主题文件模板中的html表单使用“th:action”
<form th:action="@{/youractionurl}"> ... input tags </form>
这会自动插入_csrf令牌
<input type="hidden" name="_csrf" value="4568ad84-b300-48c4-9532-a9dcb58366f3" />