masterei / laravel-signer
Laravel 签名 URL 包装器,具有可消耗和基于用户的签名 URL 等附加功能。
v1.0.0
2024-04-24 06:15 UTC
Requires
- php: ^8.0
- spatie/url: ^2.4
Requires (Dev)
README
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
如果您不想使用附加功能,本地 signedRoute 和 temporarySignedRoute 是一个不错的选择。
注意:这不会存储在数据库中,并且仅使用框架的本地验证方法进行验证。
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 方法,即 signedRoute 和 temporarySignedRoute;并且排除了域名从签名 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)。有关更多信息,请参阅 许可证文件。