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 文档 来了解更多信息和替代做法。


Practice makes perfect.

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

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

本帖已被设为精华帖!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

有点意思

1年前 评论

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

1年前 评论
fatrbaby

好牛批呀

1年前 评论

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

1年前 评论

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

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会