0

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

可以在这个 laracasts 讨论中找到它的更简单版本。

使用低于 5.5 的 Laravel 版本没有任何问题。将站点升级到 laravel 5.5 后,我注意到应该加密的值改为以明文形式显示。

我已经在包 github 帐户中提出问题,寻求帮助。与此同时,我尝试了几件事:

  1. 在新安装的 laravel 5.2 和 5.4 中添加了 elocryptfive 包 - 加密工作正常
  2. 在股票 laravel 5.5 中做了同样的事情 - 值仅在第一次保存后加密,并在每次后续更新后解密存储
  3. 我还没有在论坛/laracasts 中找到任何相关内容

似乎它可能与 5.4 和 5.5 之间的一些变化有关,我已经尝试比较Eloquent命名空间中的几个类但放弃了。

4

1 回答 1

0

再次比较 laravel/framework 包中 5.4 和 5.5 标签之间的变化后,我发现了traitgetDirty方法中 的原因。src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php

在 laravel 5.4 中有:

foreach ($this->attributes as ...

然后在 5.5 中改为:

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

由于getAttributes方法是解密数据的方法之一,因此看起来目前最明智的解决方案getDirty()是在加密特征或使用它的应用程序模型中覆盖。

修改后的方法如下所示:

public function getDirty()
{
    $dirty = [];

    foreach ($this->attributes as $key => $value) {
        if (! $this->originalIsEquivalent($key, $value)) {
                    $dirty[$key] = $value;
        }
    }

    return $dirty;
}
于 2017-09-20T10:00:50.883 回答