Spring Security v3.0.0与Thymeleaf集成CSRF时出现403禁止错误
解决Spring Security提交表单出现403 Forbidden(CSRF验证失败)的问题
问题根源
你遇到的403错误是CSRF令牌验证失败导致的。虽然Thymeleaf确实会自动为表单注入CSRF令牌,但前提是你的表单必须正确使用Thymeleaf语法,否则令牌不会被添加,最终触发Spring Security的拦截。
排查与解决步骤
1. 检查表单的Thymeleaf语法是否正确
确保你的<form>标签使用Thymeleaf的th:action属性,而非普通的action。示例:
<!-- 正确写法:Thymeleaf会自动注入CSRF令牌 --> <form th:action="@{/design}" method="post"> <!-- 表单内容 --> </form> <!-- 错误写法:不会自动添加CSRF令牌 --> <form action="/design" method="post"> <!-- 表单内容 --> </form>
普通action无法触发Thymeleaf的CSRF令牌自动注入逻辑,必须使用th:action绑定请求路径。
2. 验证页面是否生成了CSRF令牌
打开浏览器开发者工具查看页面源码,搜索是否存在以下字段:
<input type="hidden" name="_csrf" value="xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"/>
如果没有这个字段,说明Thymeleaf未生成令牌,回到第一步修正表单语法。
3. 确认请求方式为POST
Spring Security默认仅对POST、PUT、DELETE等修改型请求做CSRF验证,GET请求不会触发该拦截。如果你的表单用GET提交数据,虽不会触发CSRF错误,但GET不适合提交修改类操作,建议改为POST。
4. 保留当前SecurityConfig的CSRF配置
你当前的配置仅忽略H2Console的CSRF校验,其他路径正常启用,这是符合安全规范的正确配置,无需修改。除非特殊场景,否则不建议全局禁用CSRF,会降低应用安全性。
额外排查点
如果以上步骤都没问题,可检查:
- 用户登录后的会话Cookie是否正常存在(CSRF令牌依赖会话传递)
- 浏览器是否禁用了Cookie(会导致CSRF令牌无法正常传递)
内容的提问来源于stack exchange,提问作者tsavaph
相关产品推荐
相关产品推荐

