laravel - 带有 csrf 的 Laravel Yajra 数据表操作按钮仍然抛出 419
问题描述
我正在使用 Yajra Datatables for Laravel 来显示带有发布按钮操作的文件列表。
我有这个带有 post 方法的下载按钮,以检查是否允许用户下载该当前文件的授权。
我检查了页面,确实看到了 CSRF 令牌。但是,Laravel 仍然会抛出 419 错误。
这是一段控制器代码,我在其中使用其 CSRF 令牌在表单内生成发布按钮:
return DataTables::of($mediaItems)
//...
//ACTION BUTTONS
->addColumn('action',function (Media $file){
$button = '<form method="post" action="'.route('download.file',['media'=>$file]).'">
<meta name="csrf-token" content="'.csrf_token().'">
<button type="submit" name="download" class="btn btn-info" title="Download file"><i class="fas fa-file-download"></i></button>
</form> ';
return $button;
})
->toJson();
就在视图上 Web 浏览器的检查元素处,这就是我所看到的:
<form method="post" action="http://myApp.local/file/download/z271dd4u-b0a2-44f6-a0a5-cmxd33de3e15">
<meta name="csrf-token" content="O02W6Fu9BoW1futzAL06BbFmDfsS8lgmmx4Vd05A">
<button type="submit" name="download" class="btn btn-info" title="Download"><i class="fas fa-file-download"></i></button>
</form>
为什么我点击下载按钮还是会出现419页面过期错误?
解决方案
您必须将 csrf 令牌作为值传递。当您@csrf
在表单中使用并检查表单时,您会发现它会生成一个带有名称的隐藏输入字段,_token
其值为 csrf 令牌。您不能使用元标记通过请求传递值。所以改为使用隐藏的输入字段。
<input type="hidden" name="_token" value=" '.csrf_token().' ">
推荐阅读
- ffmpeg - 使用 Node.js 模块 fluent-ffmpeg 输入要连接的文件列表
- geolocation - 提高 GPS 精度
- javascript - Angular5 的 Canvas JS 问题
- angular - 在角度 4 中获取问题可选参数郊游问题?
- xamarin.forms - Android 上 DependencyService 的 NullReferenceException
- python - Django REST框架教程1中的ImportError:序列化
- codeigniter - AND,或在 Codeigniter 中使用 In Join 查询
- javascript - 如何使用范围或序列创建 JavaScript 数组
- python - 如何在python中获得2参数weibull分布的渐近协方差矩阵
- haskell - 在 IO monad 中进行递归