升级到Laravel 5.5后,数据加密在Eloquent模型中停止工作

时间:2017-09-20 09:31:51

标签: model eloquent laravel-5.5

我正在使用elocryptfive加密数据库中的某些字段 - 简而言之,它是一种PHP特性,在将数据写入数据库之前加密标记为加密的属性,并在向用户显示时对其进行解密(使用{{ 1}}和其他此类方法)。

可以在this laracasts discussion中找到更简单的版本。

使用5.5之前的Laravel版本时没有任何问题。在将网站升级到laravel 5.5后,我注意到应该加密的值是以明文形式呈现的。

我已经在github包中提交了问题,请求帮助。与此同时,我尝试过几件事:

  1. 在新安装的laravel 5.2和5.4中添加了elocryptfive软件包 - 加密工作正常
  2. 在库存laravel 5.5中做了相同的事情 - 这些值仅在首次保存后加密,并在每次后续更新后进行解密存储
  3. 我还没有在论坛/ laracasts中找到任何相关内容
  4. 似乎它可能与5.4和5.5之间的某些变化有关,我已经尝试比较getAttribute命名空间中的几个类但放弃了。

1 个答案:

答案 0 :(得分:0)

再次比较laravel / framework包中5.4和5.5标签之间的变化后,我在getDirty方法中找到了原因。 src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php特质。foreach ($this->attributes as ...

在laravel 5.4中有:

foreach ($this->getAttributes() as ...

然后在5.5中它被改为:

getAttributes

由于getDirty()方法是解密数据的方法之一,它看起来目前最明智的解决方案是在加密特征或使用它的应用程序模型中覆盖public function getDirty() { $dirty = []; foreach ($this->attributes as $key => $value) { if (! $this->originalIsEquivalent($key, $value)) { $dirty[$key] = $value; } } return $dirty; }

修改后的方法如下所示:

    [DllImport("dllname.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern double FunctionParser();