Laravel 5.6 新功能 —— 路由签名

file

在 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/signed-routes

译文地址:https://learnku.com/laravel/t/9404/larav...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 10

有点意思

5年前 评论

做下载资源防盗链感觉蛮有用的

5年前 评论
fatrbaby

好牛批呀

5年前 评论

挺好的,之前都只能通过自己实现。
不过因为项目历史原因,现在看着Laravel的新版本越走越远,自己只能眼巴巴的望着不能升级。

5年前 评论

PC端访问微信公众号也是实现了这两个功能,签名,签名有效性,只要修改就报错 :see_no_evil:

5年前 评论

厉害,便捷的 Laravel

4年前 评论

学习了,有意思,感觉分享

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!