Laravel 5.6 新功能 —— 路由签名

翻译 Summer ⋅ 于 4个月前 ⋅ 最后回复由 zithan 2个月前 ⋅ 3044 阅读 ⋅ 原文地址

站点的翻译文章创建时,您将第一时间收到通知。

这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

file

在 Laravel 5.6.12 版本 中加入了一个新的 URL 签名功能。在本文中,我们将着手在应用程序中使用 URL 签名,并研究如何使用它的一些配置项。

科大大 翻译于 4个月前

安装

首先,在终端运行 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,
     ];
 }

好了,现在可以给你的程序添加路由签名了。

JiaZombie 翻译于 4个月前

开始

假设我们有一套让用户快速回复活动计划的应用程序,我们希望发送 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 中的任何变量,这并非我们想要的。

科大大 翻译于 4个月前

给 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 异常。

wilson_yang 翻译于 4个月前

临时 URL

除了签名 URL 之外, Laravel 也给我们提供了一个签名过期的好办法。如果希望链接地址过期时间为1小时,我们可以把代码改成如下形式:

use \Illuminate\Support\Facades\URL;

URL::temporarySignedRoute('event.rsvp', now()->addHour(), [
    'id' => 25,
    'user' => 100,
    'response' => 'yes'
]);

它会生成如下结果:

https://example.com/event/25/rsvp/100/yes?expires=1521543365
&signature=d32f53ced4a781f287b612d21a3b7d3c38ebc5ae53951115bb9af4bc3f88a87a
wilson_yang 翻译于 4个月前

查看其他 1 个版本

了解更多

我建议你看看 Laravel 文档 和 API 文档 来了解更多信息和替代做法。

JiaZombie 翻译于 4个月前

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

译文地址:https://laravel-china.org/topics/9404/la...


本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

本帖已被设为精华帖!
回复数量: 7
  • 有点意思

    4个月前
  • 做下载资源防盗链感觉蛮有用的

    4个月前
  • 学习了

    4个月前
  • fatrbaby developer @ Roguer 5 Rocord$

    好牛批呀

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

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

    2个月前
  • @zithan 时效性

    2个月前
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 250 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Composer 中文文档

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档