GitHub:
jiaxincui/hashid
介紹
一個對Laravel應用模型ID進行對稱加密的輔助函式。
只適用於正整數加密。
安裝
$ composer require jiaxincui/hashid
配置
- 複製
config/hashid.php
檔案到Laravel專案的config
資料夾。 - 在.env檔案新增配置項
HASH_ID_ALPHABET=your-key
。- 為了Hash成更安全的字串,請手動重新生成
HASH_ID_ALPHABET
,為0-9a-zA-Z共62個字元隨機排序,字元不可重複,長度為16-62,可使用以下方法生成echo str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
簡單使用
包含兩個輔助方法
id_encode()
和id_decode()
。
在Laravel專案的任何地方均可使用這兩個函式對ID進行加密或解密。
- 為了Hash成更安全的字串,請手動重新生成
例子
echo id_encode(4568); //輸出:N5lkv0
echo id_decode('N5lkvO'); //輸出:4568
//不可對float型別數字加密,不可對負數加密,給定任何非正整數引數都會丟擲錯誤,如:
echo id_encode(2.36); //非正整數,丟擲錯誤
echo id_encode(-23); //非正整數,丟擲錯誤
//解密時任何無效字串引數或校驗錯誤都會丟擲錯誤, 如:
echo id_decode('m_Dl9'); //包含無效字元,丟擲錯誤
echo id_decode('nlK8GhRW'); //校驗錯誤,丟擲錯誤
和hashids/hashids不同的是hashids
提供多個數字或包含多個數字的陣列加密成一個字串,
解密時以陣列形式返回,這在實際應用中並不常見,反而給使用帶來一定麻煩,
而此包對此進行了一些處理,不提供多個數字或多個數字陣列的加密,解密時直接返回解密後的數字。
Laravel深度應用
加密
有2種方法實現自動加密
-
如果模型主鍵為
id
透過Hashid提供的trait,在資料庫模型中使用
use Hashid;
,對結果中的id
欄位自動加密成字串,例如:<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Jiaxincui\Hashid\Traits\Hashid;
class User extends Model
{
use Hashid;
}
* 如果模型中的主鍵不是`id`
你需要在模型中定義一個訪問器,如你的主鍵為`pid`,在Model中新增訪問器如下:
```php
public function getPidAttribute($value)
{
return id_encode($value);
}
解密
透過Hashid提供的middleware對路由引數解碼,在控制器中無需做任何操作即可解碼加密後的路由引數。
首先在App\Http\Kernel.php
中註冊中介軟體,在Kernel
類的$routeMiddleware
屬性新增中介軟體條目。例如:
'hashid' => \Jiaxincui\Hashid\Http\Middleware\Hashid::class,
現在你可以在路由中分配中介軟體了。例如:
Route::resource('/users', 'UserController')->middleware('hashid');
中介軟體引數
預設情況下,Hashid
中介軟體會解密當前路由的所有路由引數,如果你想指定被解密的路由引數可在中介軟體傳入引數,例如:
Route::get('users/{user}/posts/{post}/comments/{comment}', function ($user, $post, $comment) {
//
})->middleware('hashid:user,post');
以上例子中介軟體只解密給出的引數,如以上例子會解密路由引數user
和post
,不會解密commnent
現在你的應用已經具備完整的加密和解密模型ID的功能。
本作品採用《CC 協議》,轉載必須註明作者和本文連結