laravel对csrf非常重视,专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久,那么您可能对于web.php路由文件的post请求很疑惑,因为get请求很顺利,而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的csrf保护引起的。
根据laravel官方解释,web.php下的路由对于POST
、PUT
、PATCH
或 DELETE
请求都默认采取csrf保护。
在web.php下,csrf保护只是对普通form表单提交、apipost等才有的,而使用axios,inertia的form则不受csrf保护影响。
我这里给出3种情况的解决方案
一、让路由不接受CSRF检查。
二、使用Apipost等工具访问路由时检查CSRF
编写取出token的路由
用GET请求token并打印出来
最后在post请求种带上token就可以顺利访问post请求了
三、在blade模板中发起post请求检查CSRF
先创建2个路由,get路由负责创建blade模板,post路由就是最终的post请求
blade模板如下
在浏览器中展示blade模板
点击Submit按钮后展示
四、发起PUT/PATCH请求需要添加X-CSRF-TOKEN头,值和_token值一样即可,body可不用带_token参数
api.php下的路由默认是不采取CSRF检查
展示get请求
展示post请求
如果在api.php下想启用CSRF检查呢?其中一种方式可以采用单页面应用认证
创建路由
配置域基于 Laravel 会话 cookie 的“有状态”认证。
我这里配置为testlaravel.com域,大家根据各自情况配置各自的域。
指导 Laravel 来自您的 SPA 的传入请求可以使用 Laravel 的会话 cookie 进行认证
一旦配置$middleware->statefulApi();,不仅仅是想启用CSRF检查的路由会执行CSRF检查,api.php下面的所有路由对于来自SPA的post请求都会进行CSRF检查。而如果使用Apipost等工具进行post请求还是不会进行CSRF检查
在Dashboard.vue下编写axios请求
在浏览器中测试前需要先行登录
核对请求地址
核对请求参数
查看响应结果