我們做完了針對文章的各種功能,也做了用戶權限的管控。但是有的人可能會擔心資料庫的內容不夠安全,或許可以加密一下。
這部分, Laravel 也提供了非常簡單的做法,我們一起來嘗試玩看看!
Laravel 的加密非常簡單,是透過 encrypt() 這個函式實作。
我們透過 test 來測試看看
Route::get('/test', function(){
return encrypt('123456789');
});
應該會看到一串很像亂碼的數字。這邊要注意,加解密的密碼會跟隨網站的 APP_KEY 變動,所以如果你執行
$ php artisan key:generate
這串加密後的文字,內容就會不一樣了。
要解密的話,也很簡單,就是用 decrypt()來實作。我們可以透過改寫 test
Route::get('/test', function(){
return decrypt(encrypt('123456789'));
});
就可以解密成原來的 123456789 了。
接著,我們要來介紹 Eloquent 的一個功能:Accessor 和 Mutator
用之前介紹的兩個函式,其實已經可以實作出加解密的功能了。我們只要在 store 和 update 的時候加密,在 index 和 show 的時候解密,基本上功能就算是完成了。
不過,這樣的設計有個缺點,就是每次取用或者更動 Post 的時候,你都要根據寫入或者取出資料時,重新加上加密或者解密。這樣總讓人感覺很麻煩。
幸好,透過 Accessor 和 Mutator 這個功能,我們就可以很簡單的處理加解密的功能。
什麼是 Accessor 和 Mutator 呢?
簡單的說,假設你希望在寫入 Model 的某個值 foo 之前,做一些特殊的處理,只要在 Model 裡面加上 setFooAttribute() 這個函式,那麼在寫入 foo 的時候,就不是寫入內容,而是會呼叫 setFooAttribute()。這類函式被稱為 Mutator。
假設你希望取得 Model 的某個值 foo,只需要在裡面加上 getFooAttribute() 這個函式,不管該物件原本有沒有這個變數,或者這個變數原本內容是什麼,我們都是透過 getFooAttribute() 來取得 foo。這類函式則是被稱為 Accessor。
說了這麼多,不如從範例中實際動手做學習,我們來嘗試看看吧!
改寫 Post,幫他加上兩個函式,getContentAttribute() 和 setContentAttribute()
public function getContentAttribute($content)
{
return decrypt($content);
}
public function setContentAttribute($content)
{
$this->attributes['content'] = encrypt($content);
}
然後,我們把之前沒有加密的資料清空
$ php artisan migrate:refresh --seed
然後,我們到資料庫裡面看看。如果操作正確的話,現在資料庫裡面的所有測試文章,應該都會是亂碼。
不過,我們在 http://127.0.0.1/posts 實際看到的文章,卻全部都是原本的樣子。到這邊,我們的加解密功能,就大功告成囉!
小小總結一下今天我們學到的東西。
今天我們學會了 Laravel 提供的加解密功能,加上怎麼利用 Model 的 Accessor 和 Mutator 來簡化加解密的程式。
希望各位讀者覺得今天有收穫!我們明天見!