Laravel 5.6 新功能 —— 路由签名
在 Laravel 5.6.12 版本 中加入了一个新的 URL 签名功能。在本文中,我们将着手在应用程序中使用 URL 签名,并研究如何使用它的一些配置项。
安装
首先,在终端运行 composer update laravel/framework
命令更新框架,将您的框架升级到 5.6.12 版本,如果你的框架已经是最新的 5.6.12 发行版,可以忽略此操作。
然后,在 /app/Http/Kernel.php
文件里添加新的路由中间件 ValidateSignature
。
protected $routeMiddleware = [
// ...
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+ 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}
好了,现在可以给你的程序添加路由签名了。
开始
假设我们有一套让用户快速回复活动计划的应用程序,我们希望发送 email 让所有用户快速回复“参加”还是“不参加”。然而我们并不希望强迫用户在程序已经退出登录的情况下需要重新登录才能作出回复。
首先在 routes/web.php
声明了 event.rsvp
路由。
Route::get('event/{id}/rsvp/{user}/{response}', function ($id, $user, $response) {
// 用户回复活动的响应
})->name('event.rsvp');
URL 像下面这样
use \Illuminate\Support\Facades\URL;
Url::route('event.rsvp', ['id' => 25, 'user' => 100, 'response' => 'yes']);
会生成:
https://example.com/event/25/rsvp/100/yes
我们可以看到如果有不怀好意的用户会很容易地修改 URL 中的任何变量,这并非我们想要的。
给 URL 签名
现在我们已经拥有签名 URL 的重要基石,接下来我们进行签名处理。
第一步,添加 signed
中间件到路由配置中。
Route::get('event/{id}/rsvp/{user}/{response}', function ($id, $user, $response) {
// Add response from user for event.
})->name('event.rsvp')->middleware('signed');
接下来, 在应用中将 Url::route()
改成 Url::signedRoute()
。
use \Illuminate\Support\Facades\URL;
Url::signedRoute('event.rsvp', ['id' => 25, 'user' => 100, 'response' => 'yes']);
Laravel 会基于给定的路由名称生成一个新的签名 URL,这些参数会生成类似如下 URL:
https://example.com/event/25/rsvp/100/yes?
signature=30a3877b00890fff0d7ca25f82c6387ff16a98d21008ddc9689ed3c20ef13cd4
此时,在使用了签名过的 URL 情况下,如果一个 “好奇” 的用户试图篡改用户 ID,比方把 100
改成 101
,或者把签名尾部的 4
改成 5
,Laravel 将会抛出 Illuminate\Routing\Exceptions\InvalidSignatureException
异常。
临时 URLs
除了对一个 URL 进行签名, Laravel 还提供了一个非常好的对签名增加过期时间的方法。如果我们想要让生成的链接在1小时后过期,可以如下更新我们的代码。
use \Illuminate\Support\Facades\URL;
URL::temporarySignedRoute('event.rsvp', now()->addHour(), [
'id' => 25,
'user' => 100,
'response' => 'yes'
]);
最终生成的 URL :
https://example.com/event/25/rsvp/100/yes?expires=1521543365
&signature=d32f53ced4a781f287b612d21a3b7d3c38ebc5ae53951115bb9af4bc3f88a87a
了解更多
我建议你看看 Laravel 文档 和 API 文档 来了解更多信息和替代做法。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: