Laravel哈希數據ID
Laravel 哈希數據 ID
為甚麼需要 hash ID
在專案中,我們數據的 ID 通常是自行增加的,如使用 Url get 的參數是商品 ID 會造成以下問題
- 數據的 ID 是公開的,不希望對外暴露有規則索引
- 防止爬蟲侵擾
- 容易根據 ID 猜測數專案中的商品數量
- 隨著數據的增長,ID 會越來越大,無法統一長度
這時後就可以靠 hash id 來加密解決問題,還有很多種解決方案,例如使用 UUID,使用自己的邏輯創建新的 id 欄位,今天來介紹一個簡單的解決方案是基於hashids/hashids的項目vinkla/hashids
安裝
composer require vinkla/hashids
我是使用 laravel7 在安裝過程中報錯,
有遇到此問題的小夥伴可以安裝看看版本 8.0.0 試試
composer require vinkla/hashids ^8.0.0
Laravel Hashids 需要連接配置。首先,您需要發布所有供應商資產php artisan vendor:publish --provider="Vinkla\Hashids\HashidsServiceProvider"
調整配置
到config\hashids.php
調整參數
更改 salt,可以為目標數字增加變量,確保他人沒有相同的 salt 情況下,無法轉換回數字
更改 length,可以指定轉換後的字符串最小長度
vinkla/hashids 是透過對數字進行編碼形成字符串,當然也可以對編碼過的字符串進行解碼,達成加密數據 ID 的效果
'connections' => [ |
基本範例
可以使用php artisan tinker
在 shell 中嘗試
In shell
>> Hashids::encode(1); |
In controller
use Vinkla\Hashids\Facades\Hashids; |
更換不同連接規則
如更改後找不到連接器,清除 config cache,php artisan config:cache
// 使用alternative的配置encode |
更改預設連接
預設是使用main
的配置
Hashids::getDefaultConnection(); // 會回傳 main. |
可以使用以下方法更改預設連接
Hashids::setDefaultConnection('alternative'); // 此時預設會變成 `alternative`. |
使用情境
我是使用在 model,增加一個 hashid 的欄位,假如 model 名為 Store,就可以使用Store::find(1)->hashid
取得 ID 是 1 的 store hashid
protected $appends = array('hashid'); |