Laravel 5.6 新功能 —— 路由签名
67

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://laravel-china.org/topics/9404/la...

本帖已被设为精华帖!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7

有点意思

6个月前

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

6个月前

学习了

6个月前
fatrbaby

好牛批呀

6个月前

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

5个月前

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

4个月前

@zithan 时效性

4个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!