SpringBoot+SpringSecurity防护CSRF(基于Html)

关于SpringSecurity防护CSRF网上很多资料都是基于Thymeleaf(jsp)的,连官方文档也是:

SpringBoot+SpringSecurity防护CSRF(基于Html)

但是如果是前后端分离应该怎么处理呢,也可以自己写过滤器实现,不过感觉比较麻烦;其实就算是使用Html实现也是很简单的,可以首先看看SpringSecurity防护CSRF的核心过滤器:

SpringBoot+SpringSecurity防护CSRF(基于Html)

重点看看它的doFilterInternal()方法:

SpringBoot+SpringSecurity防护CSRF(基于Html)

这个方法将CrsfToken存起来了,而CrsfToken也就是个很简单的接口:

SpringBoot+SpringSecurity防护CSRF(基于Html)

再来看看到底是怎么存的呢:

SpringBoot+SpringSecurity防护CSRF(基于Html)

也就是存在session中了,key值为静态常量DEFAULT_CSRF_TOKEN_ATTR_NAME,那前台只需要获取session中的值并保存起来,不就和使用Thymeleaf(jsp)(具体使用可参看我的另一篇博客:SpringBoot+SpringSecurity防护CSRF(基于Thymeleaf))一样了吗。但是有一个问题,session是jsp的内置对象,Html静态页面是无法直接获取session的。那就只能用别的方法(当然,也可以存在cookie里面,这样浏览器就可以获取了,具体基于cookie这篇博客说的很清楚:https://blog.****.net/yiifaa/article/details/78459677)。

可以在SpringSecurity最终登陆成功Handler中将存在seesion中的crsfToken返回给前台:
key值是private的,那只能将值copy出来了。

先定义一个VO返回给前台:

SpringBoot+SpringSecurity防护CSRF(基于Html)

SpringBoot+SpringSecurity防护CSRF(基于Html)

启动项目,登陆成功后,返回:

SpringBoot+SpringSecurity防护CSRF(基于Html)

结合我在上一篇博客(SpringBoot+SpringSecurity防护CSRF(基于Thymeleaf))中的测试页面:

SpringBoot+SpringSecurity防护CSRF(基于Html)

值是一模一样的,只要能将这两个值传给前台,剩下的让前台每次ajax请求都执行这个方法即可:

SpringBoot+SpringSecurity防护CSRF(基于Html)