davide7h / encoded-ids
一种在路由、API或其他场景下隐藏ID的方法,在这些场景中您不希望用户看到您数据库记录的实际ID
Requires
- php: ^8.1
- laravel/framework: ^8.0|^9.0|^10.0
- sqids/sqids: ^0.4.1
README
为您的 Eloquent 模型提供 ID 隐藏功能
文档、安装和用法说明
它的作用
此软件包允许您使用方便的Trait,即时为您的所有Eloquent模型启用编码ID,以便您可以在路由和API端点中使用,而不必向用户暴露数据库记录的真实ID。
要求
此软件包处于积极开发中,因此其要求可能发生变化。目前它已在以下环境中成功测试:
- Laravel ^8.x | ^9.x | ^10.x
- PHP >= 8.1
重要的安全提示
此软件包需要 Sqids 软件包来哈希数字ID。它将被自动安装。
重要的是要重申Sqids软件包的作者在其网站上明确声明的:这是一个**不是加密库**,生成的ID在攻击者发现用于生成它的字母表时仍然可以解密。它仅用于美观目的,使ID不那么明显,更难猜测,但不是加密加密。
不要用它来隐藏敏感信息!
安装
只需运行 composer require davide7h/encoded-ids
这将下载并提取软件包及其依赖项(Sqids)。自动发现功能将自动注册软件包 ServiceProvider。
生成字母表和发布配置
php artisan encoded-ids:install
.
此命令将生成一个随机打乱的字母表,用于编码和解码您的ID。
它还将发布配置文件 config/encoded-ids.php
。在这里您可以找到:
- 新生成的 字母表(如果您需要更改它或用全新的一个替换它)
- 填充密钥,用于指定编码ID的最小长度(默认:8个字符)
这样就大功告成了!
使用
编码模型ID
使用 HasEncodedId
Trait为您的模型提供显示其实际ID的隐藏版本的能力,就像使用一样简单
<?php namespace App\Models; ... use Davide7h\EncodedIds\Traits\HasEncodedId; ... class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, HasEncodedId; ... }
现在您的模型将具有encoded_id
属性,您可以使用它来访问模型ID的隐藏版本
$user = User::first(); echo $user->id; //example output: 1 echo $user->encoded_id; //example output: "ULwu08NB"
获取模型
此软件包提供了一种方便的方法,使用encoded_id
属性查询数据库记录,而无需对其进行解码。只需在您的模型类上调用find
或findOrFail
方法,就像您通常使用实际(数字)ID作为参数一样,但也可以使用它们的隐藏版本(作为字符串)
User::find(1) //returns the User model with ID = 1; User::find("ULwu08NB") //also returns the User with ID = 1;
解码ID
如前所述,在将ID排队到数据库之前,无需显式解码您的ID。尽管如此,如果需要手动解码,软件包提供了一个EncodingService
类,您可以在代码的任何地方使用它来编码或解码整数,无论您认为为什么原因
... use Davide7h\EncodedIds\Services\EncodingService; ... EncodingService::encode(1); //example output: "ULwu08NB" EncodingService::decode("ULwu08NB"); //example output: 1;
请注意,EncodingService
类的encode
方法期望一个Int
作为参数并返回一个String
,而decode
方法期望一个String
并返回解码后的Int
,如果提供的字符串是有效的编码,否则返回null
。
参数化路由
使用 依赖注入
从参数化路由中获取实际模型非常方便,但遗憾的是,这仅在用于填充路由的参数作为你模型数据库表中的一列存在时才有效。在使用计算属性(如 encoded_id
)时,之前常用的解决方案是放弃依赖注入,在控制器内部解码后直接查询数据库以获取所需的模型
//Route file: Route::get('/users/{encoded_id}', [UserController::class, 'getUser']) //UserController class: public function getUser(String $encoded_id) { $user = User::findOrFail($encoded_id); ... }
但不必担心!此包扩展了Laravel的内置路由绑定功能,使您能够在参数化路由中使用编码ID,同时仍然能够在控制器方法中注入您的模型,而不必在控制器内部手动查询数据库,从而为实际的控制器逻辑留出空间,而不会被不必要的操作所混淆
//Route file Route::get('/users/{user:encoded_id}', [UserController::class, 'getUser']) //UserController public function getUser(User $user) { .... }
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。