IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 使用 Laravel 签名的 URL -> 正文阅读

[PHP知识库]使用 Laravel 签名的 URL

WPCMF 开源内容管理系统?

https://gitee.com/wpcmf/wpcmf.git

在一个项目中,您可能需要生成唯一的 URL,这些 URL 执行一些您需要确保用户没有以任何方式更改 URL 的代码。例如,从时事通讯中取消订阅用户,或者为用户创建一个无需密码即可注册的链接,您可能还希望仅为您的电子邮件订阅者提供折扣。

无论您的用例是什么,Laravel 都提供了允许我们使用签名 URL 的功能。

生成签名 URL
要生成签名 URL,我们需要做的第一件事是创建一个命名路由。例如,我将创建一个命名路由,以便在用户单击链接时取消订阅。

// routes/web.php
Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
? ? ? ?->name('unsubscribe');


现在,要生成签名 URL,我们可以使用 URL?

use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);


该signedRoute方法的第一个参数是路由的名称。这里我使用的是unsubscribed因为这是我们在上面给路由指定的名称,第二个参数是我们要传递给路由的路由参数,在本例中是用户 ID。此方法将返回一个类似这样的 URL:

https://yoursite.com/unsubscribe/1?signature=7594beb1a7af889d997eedc50f68eadb8b2e8d4097ba3a9ff1c600ffa8a02e49

正如你所看到的,Laravelsignature使用散列附加了一个参数到 URL,这表示 URL,因此如果用户修改该 URL 的任何部分,散列将无效。

临时签名的 URL
您可能还想创建一个在一段时间后过期的 URL,您也可以使用temporarySignedRoute方法创建这种类型的 URL

return URL::temporarySignedRoute(
? ? 'unsubscribe', now()->addMinutes(30), ['user' => 1]
);


这个方法的第二个参数是 URL 应该过期的时间,使用这个方法expires会在 URL 中添加一个参数,Laravel 会报告这个 URL 无效。

验证 URL
我们现在已经创建了签名 URL,但到目前为止,我们还没有验证哈希。为此,我们可以signed在路由中使用内置的中间件。为此,只需在您的路由声明中添加中间件。

// routes/web.php
?

Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
? ? ? ?->name('unsubscribe')
? ? ? ?->middleware('signed');


通过添加这个中间件,Laravel 将自动检查哈希并抛出 403 HTTP 代码。

个性化错误页面。
您可能还想自定义当 URL 无效时用户看到的错误。这可以通过为 定义自定义可渲染闭包来实现InvalidSignatureException:

// app\Exceptions\Handler.php
use Illuminate\Routing\Exceptions\InvalidSignatureException;
?
/**
?* Register the exception handling callbacks for the application.
?*
?* @return void
?*/
public function register()
{
? ? $this->renderable(function (InvalidSignatureException $e) {
? ? ? ? return response()->view('error.link-expired', [], 403);
? ? });
}


在这个闭包中,我们可以定义用户在访问无效的单点 URL 时会看到什么。

在没有中间件的情况下验证 URL
在某些情况下,您可能需要验证控制器中的 URL。您可以通过从路由定义中删除singed中间件来做到这一点,而是hasValidSignature在请求中使用。

public function unsubscribe(Request $request)
{
? ? if (!$request->hasValidSignature()) {
? ? ? ? abort(401);
? ? }
? ??
? ? //...
}


如果我们需要自定义体验,这可以提供更多的灵活性。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:20:14  更:2022-04-18 17:22:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 4:08:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计