masterei/laravel-signer

Laravel 签名 URL 包装器,具有可消耗和基于用户的签名 URL 等附加功能。

v1.0.0 2024-04-24 06:15 UTC

This package is auto-updated.

Last update: 2024-09-24 07:22:12 UTC


README

Latest Version on Packagist Total Downloads

Laravel 签名 URL 包装器,具有可消耗和基于用户的签名 URL 等附加功能。

安装

您可以通过 composer 安装此包。

composer require masterei/laravel-signer

您需要发布迁移来创建包表。

php artisan vendor:publish --tag="signer-migration"

之后,您需要运行迁移命令。

php artisan migrate

可选地,您可以使用以下命令发布配置文件:

php artisan vendor:publish --tag="signer-config"

兼容性

  • Laravel 版本 9.x.x 或更高版本

使用方法

基本用法

use App\Models\User;
use Masterei\Signer\Signer;

// creating signed url that can only be accessed by limited number of times
Signer::consumableRoute('subscribe', 1, ['user' => 1]);

// expires after a specified amount of time
Signer::temporaryConsumableRoute('subscribe', now()->addMinute(), 1, ['user' => 1]);


// creating signed url that can only be access by certain specified user/s
$user = User::first();
Signer::authenticatedRoute('subscribe', $user, ['user' => 1]); 

// note: user parameter can accept; user id as int or array, model, collection

// expires after a specified amount of time
Signer::temporaryAuthenticatedRoute('subscribe', now()->addMinute(), $user, ['user' => 1]);

附加参数

通常,您可以通过向类方法提供 absolute 参数来排除域名,从而从签名 URL 哈希中排除域名。

return Signer::consumableRoute('subscribe', 1, ['user' => 1], absolute: false);

您可能还希望强制使用域名前缀,即使您已经通过向类方法提供 prefixDomain 参数从签名 URL 哈希中排除了域名。

return Signer::consumableRoute('subscribe', 1, ['user' => 1], prefixDomain: true);

高级用法

return Signer::route('subscribe')   // route name
    ->parameters(['user' => 1])     // additional parameters
    ->authenticated([1, 2])         // user id as int or array, model, collection
    ->consumable(2)                 // number of times url can be accessed
    ->relative()                    // exclude domain from signature hashing
    ->prefixDomain()                // force domain prefix on relative url
    ->expiration(now()->addDays(2)) // url expiration period; accepts: Carbon/Carbon instance
    ->make();                       // finally create the url

本地签名 URL

如果您不想使用附加功能,本地 signedRoutetemporarySignedRoute 是一个不错的选择。

注意:这不会存储在数据库中,并且仅使用框架的本地验证方法进行验证。

Signer::signedRoute('subscribe', ['user' => 1]);

// You may exclude the domain from the signed URL hash
// by providing the `absolute` argument to the signedRoute method:
Signer::signedRoute('subscribe', ['user' => 1], absolute: false);

// If you would like to generate a temporary signed URL
// that expires after a specified amount of time.
Signer::temporarySignedRoute('subscribe', now()->addDay(), ['user' => 1]);

验证签名路由请求

包签名路由

// To ensure that the incoming request has a valid signature,
// you have to include the middleware into the route for it to work.
Route::post('subscribe/{user}', function (Request $request) {
    // ...
})->name('subscribe')->middleware('signer');

// Sometimes, you want to forcefully disable the framework native validation,
// you should provide the `strict` argument to the middleware parameter.
Route::post('subscribe/{user}', function (Request $request) {
    // ...
})->name('subscribe')->middleware('signer:strict');

本地签名路由

如果您的路由使用本地签名 URL 方法,即 signedRoutetemporarySignedRoute;并且排除了域名从签名 URL 哈希中,您应该提供 relative 参数给中间件才能正常工作。

Route::post('subscribe/{user}', function (Request $request) {
    // ...
})->name('subscribe')->middleware('signer:relative');

将签名路由模型重新构造回签名 URL 的方法

use Masterei\Signer\Models\Signed;

return Signed::first()->url();

解析 URL 并获取其底层数据

use Masterei\Signer\URLParser;

$parsedUrl = URLParser::fromString(request()->getUri());
return $parsedUrl->getSignature();

使用签名查找签名 URL 模型

use Masterei\Signer\Models\Signed;
use Masterei\Signer\URLParser;

$parsedUrl = URLParser::fromString(request()->getUri());
return Signed::findValidSignature($parsedUrl->getSignature());
// or specify with path
return Signed::findValidSignature($parsedUrl->getSignature(), $parsedUrl->getPath());

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件