Spring security+Thymeleaf遇见的post请求403错误。
1.首先:403错误,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。
2.遇见这个问题,首先我想到的是security中拦截器是否能设置post请求的释放,所以我去尝试了一下。
发现了方法中有个参数设置Http请求的,

——然后我设置后发现它这里默认又变成了路径的参数了,卒!

3.百度一番后找到了一个原因:自身框架CsrfFilter与Rest服务Post方式的矛盾
具体内容:只有GET|HEAD|TRACE|OPTIONS这4类方法会被放行,其它Method的http请求,都要验证_csrf的token是否正确,而通常post方式调用rest服务时,又没有_csrf的token,所以校验失败。
具体解决方案:自定义了源码中的Matcher,然后写一个url进行排除。导致其在验证的时候不会去验证这个这个路径的post请求的token。
4.上述方法不得,因为其并没有从spring框架中解决问题。无奈之下查看Spring Security的文档。
看到了一处原因是,因为post请求中需要发送token到后台,security框架自动识别正确有无。
解决方案:只要添加这个token,后台就会验证这个token的正确性,如果正确,则接受post访问。
5.因为我们使用的是Thymeleaf视图模板。使用如下的方法:
Put CSRF into Headers in Spring 4.0.3 + Spring Security 3.2.3 + Thymeleaf 2.1.2

但是很可惜,用这个并没有发生什么事情。也许我的js中因为不是ajax发送的请求原因。
6.最终解决方案:思考了一番,既然是只要传入这个token,就能验证通过,那我在form表单中加入一个token传入后台不就行了
(后台不需要写一个token参数去接收,security框架会自动查找验证有无)。

点进去发现是一处CSRF的Token管理接口。

重新测试了一遍,问题解决。
下面沾上加入token的代码,方便下次偷懒摸鱼。
<input type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}"/>
浙公网安备 33010602011771号