我可以用Crypt
加密/解密我的数据。我想加密数据库中的一些信息(例如姓名、电子邮件、电话号码等)。
假设我希望对所有内容进行加密,我希望能够在后台自行执行此操作,我可以通过覆盖create
and 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”来做到这一点,那就更好了。
加密其实没有意义一切。例如,您永远不想加密主键;这甚至没有意义。同样,您可能不想加密日期字段;您将无法对它们执行任何类型的 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 的访问器功能,你必须多花点功夫。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)