2016-08-01 21 views
1

我有,我可以解密密碼,這樣的代碼:如何將加密應用於任何模型請求?

use ProjectName\Models\Some; 

Some::find(1)->pass; 

它會自動解密通,這是在我的數據庫加密。 但是,如果我的例子做不同的要求,我的模型:

Some::find(1); 

其無法正常工作。請有人能解釋我必須做什麼?

這是全碼:

trait Encryptable 
{ 
    public function getAttribute($key) 
    { 
     $value = parent::getAttribute($key); 

     if (in_array($key, $this->encryptable)) { 
      return Crypt::decrypt($value); 
     } 

     return parent::getAttribute($key); 
    } 

    public function setAttribute($key, $value) 
    { 
     if (in_array($key, $this->encryptable)) { 
      parent::setAttribute($key, Crypt::encrypt($value)); 
      return; 
     } 

     parent::setAttribute($key, $value); 
    } 
} 
+0

「我有可以用這種方式解密密碼的代碼:」您可能想閱讀[如何在2016年安全地存儲密碼](https://paragonie.com/blog/2016/02/02/how-safely -store密碼,在-2016)。你不應該加密密碼。 –

回答

0

這是更新的答案

爲了讓您的預期行爲,可以覆蓋的Illuminate\Database\Eloquent\Modelhydrate()方法解密數據庫檢索後的模型。

原來的方法是:

/** 
* Create a collection of models from plain arrays. 
* 
* @param array $items 
* @param string|null $connection 
* @return \Illuminate\Database\Eloquent\Collection 
*/ 
public static function hydrate(array $items, $connection = null) 
{ 
    $instance = (new static)->setConnection($connection); 

    $items = array_map(function ($item) use ($instance) 
    { 
     return $instance->newFromBuilder($item); 
    }, $items); 

    return $instance->newCollection($items); 
} 

你可以重寫它加入你的解密這樣的東西:

/** 
* Create a collection of models from plain arrays. 
* 
* @param array $items 
* @param string|null $connection 
* @return \Illuminate\Database\Eloquent\Collection 
*/ 
public static function hydrate(array $items, $connection = null) 
{ 
    $instance = (new static)->setConnection($connection); 

    $items = array_map(function ($item) use ($instance) 
    { 
     foreach ($instance->encryptable as $attribute) { 
      // Remember to do any aditional check here, like check if is_null 
      // and catch any exceptions also. 
      $item->$attribute = \Crypt::decrypt($item->$attribute); 
     } 

     return $instance->newFromBuilder($item); 
    }, $items); 

    return $instance->newCollection($items); 
} 

在這裏,我們解決了在模型裝載的解密部分,細膩。

要解決保存時的加密問題,可以使用saving事件加密屬性,然後在saved事件中,將它們恢復爲未加密的值。

這樣,在您的應用程序中,模型始終是普通的,但在數據庫上,它將被加密。

+0

在這種情況下,我什至不進入attributesToArray()函數。用:: all()和:: find方法測試它: –

+0

@HenryKolesnik':: all()'不要直接序列化模型,所以在'dd($ model)'中,你會看到原始屬性課程。 讓我建議你另一種方式去做你想做的事。我會在幾分鐘內更新答案! –

+0

@HenryKolesnik看看這個新的答案! –

相關問題