我們做完了針對文章的各種功能,也做了用戶權限的管控。但是有的人可能會擔心資料庫的內容不夠安全,或許可以加密一下。
這部分, 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 來簡化加解密的程式。
希望各位讀者覺得今天有收穫!我們明天見!