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}"/>

 

 

posted on 2021-07-06 12:06  汤姆猫8  阅读(878)  评论(1)    收藏  举报