[扩展推荐] Laravel-caffeine 让你的 CSRF Token 永不过期(TokenMismatchException)
目标
如果你的项目中有一个较长的表单需要填写,那么会花费你很多的时间。如果它隐藏在用户会话下面,那么它将会超时,默认情况下,有 120 分钟。看起来时间似乎足够了,但是如果用户让表单页面打开时间更长,去喝杯咖啡或者做些其他的,然后过一会再完成它,那么该怎么办呢?
答案是: https://github.com/GeneaLabs/laravel-caffe...
这个包可以防止表单在屏幕上停留相当长的时间后提交超时。
实现
为了达到这个目的,我们发送一个 caffeine-drip (一个定期请求),以防止会话超时。这仅在具有 _token
字段页面上实现,因此,所有其他页面将正常超时。
推理
我选择这种方法是为了避免以下情况,从而保证站点安全性的完整性:
- 在不安全的端点上公开 CSRF 令牌。
- 消除指定路由上的 CSRF 令牌验证,甚至完全消除。
- 移除所有页面上的会话超时。
注意事项
路由
这个包添加了 genealabs/laravel-caffeine
下面的路由。
安装
对于 Laravel 5.2 ,请遵循说明
说明: https://github.com/GeneaLabs/laravel-caffe...
-
安装包:
composer require genealabs/laravel-caffeine
-
这仅适用与 Laravel 5.4 或以下版本: 在
config/app.php
中添加服务提供者条目:// 'providers' => [ GeneaLabs\LaravelCaffeine\Providers\Service::class, // ],
-
如果你运行 5.5 或者更高的版本,请从
config/app.php
中删除 providers 条目。 -
如果你以前注册过中间件,请从
app/Http/Kernel.php
中删除以下中间件:// protected $middleware = [ GeneaLabs\LaravelCaffeine\Http\Middleware\LaravelCaffeineDripMiddleware::class, // ];
-
只有在需要自定义配置文件时才发布配置文件
php artisan caffeine:publish --config
使用
就是这样!当页面在浏览器中打开时,它发现一个带有 _token
字段或名为 csrf-token
元标记的表单时,它将自动应用自己。
禁止应用
默认是全局应用的,如果你想控制 caffeine 的使用,这里有两种方法:
- 使用在 Blade 中使用
禁用 meta
标签; - 启动路由中间件模式,然后在路由中单独启用。
Meta 标记方法
如果你希望阻止某个页面的 caffeine 使用,可以在此页面中新增 meta 标记:
<meta name="caffeinated" content="false">
路由中间件方法
若要启用该模式,需要你发布配置文件(参阅上面的配置部分),然后将 use-route-middleware
值改为 true
。
这将禁用默认的全局中间件模式(该模式应用于整个应用程序中包含 CSRF 令牌的任何页面)。现在,你需要使用路由中间件在给定的路由或路由组中选择性的启用 Caffeine :
Route::any('test', 'TestController@test')->middleware('caffeinated');
Route::group(['middleware' => ['caffeinated']], function () {
Route::any('test', 'TestController@test');
})
你仍然可以使用 route
中间件方法,并通过编辑 app/Http/Kernel.php
将其应用于所有路由,并将其添加至 web
中间件组。
你应该只有在非常特定的用例中,需要弃用默认的全局中间件选项时,才使用此选项。
最后需要强调的是:只有当页面包含表单时 caffeine 才会生效,如果没有,将不会修改你的应用程序。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
请教大家一个问题,在翻译第四段的时候,
Caffeination
不是很理解,直译的话为:咖啡因 的意思,我根据上下文的意思我翻译成了占用,所以在这里请教下大家,Caffeination
一词在文中应该翻译成什么意思@sayhe110 我稍作修改,你瞧瞧哈
@Summer 语义上比“占用”好理解多了 :+1: