我可以使用Crypt
来加密/解密我的数据。我想加密我的数据库中的一些信息(例如姓名,电子邮件,电话号码等等)。
假设我希望加密所有内容,我希望能够在后台自行完成此操作,我可以通过覆盖create
和save
函数来执行此操作:
// For instance, the save() function could become
public function save(array $options = array())
{
foreach ($this->attributes as $key => $value)
{
if (isset($value)) $this->attributes[$key] = Crypt::encrypt($value);
}
return parent::save($options);
}
现在,我希望以相同的方式执行解密,因此当我说User::find($id)
时,返回的$user
已经被解密。还有其他功能,例如firstOrFail()
get()
first()
以及所有功能。
我也希望在使用关系时扩展此功能(因此User::with('someOtherTable')->find($id)
也可以工作)。
这可能吗?如果这是不可能的,我正在考虑创建一个辅助函数decyrpt()
function decrypt($array)
{
if (!is_array($array)) return Crypt::decrypt($array);
$result = [];
foreach($array as $key => $value) $result[$key] = decrypt($value);
return $result;
}
首先通过我的所有结果,然后开始使用它们,但如果Laravel会提供这个,或者如果有一个" Laravel Way"那么它会更好。这样做。
答案 0 :(得分:16)
加密所有内容并没有多大意义。例如,您永远不想加密主键;这甚至没有意义。同样,您可能不想加密日期字段;你将无法对它们执行任何类型的SQL查询。
考虑到这一点,你可以尝试这样的事情:
class BaseModel extends Eloquent {
protected $encrypt = [];
public function setAttribute($key, $value)
{
if (in_array($key, $this->encrypt))
{
$value = Crypt::encrypt($value);
}
return parent::setAttribute($key, $value);
}
public function getAttribute($key)
{
if (in_array($key, $this->encrypt))
{
return Crypt::decrypt($this->attributes[$key]);
}
return parent::getAttribute($key);
}
public function attributesToArray()
{
$attributes = parent::attributesToArray();
foreach ($attributes as $key => $value)
{
if (in_array($key, $this->encrypt))
{
$attributes[$key] = Crypt::decrypt($value);
}
}
return $attributes;
}
}
然后让所有模型扩展此模型,并将$encrypt
属性设置为您希望为该特定模型加密的任何列。
P.S。如果你想使用Eloquent的访问器功能,你将不得不再玩这个。
答案 1 :(得分:1)
值得一提的是Laravel 4的Elocrypt库。这是一个更精细的解决方案,其工作方式相同。如果您使用的是Laravel 5,请使用此代码:Elocrypt 5。