代码之家  ›  专栏  ›  技术社区  ›  bjauy

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

  •  0
  • bjauy  · 技术社区  · 7 年前

    elocryptfive 为了加密数据库中的某些字段,简而言之,PHP的一个特点是在将标记为可加密的属性写入数据库之前对其进行加密,并在向用户显示时对其进行解密(使用 getAttribute

    更简单的版本可以在 this laracasts discussion

    使用早于5.5的Laravel版本时没有任何问题。在将站点升级到laravel 5.5之后,我注意到原本应该加密的值被明文表示。

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

    1. 在stock laravel 5.5中也做了同样的操作-值仅在第一次保存后加密,并在每次后续更新后解密存储

    Eloquent 但放弃了。

    1 回复  |  直到 7 年前
        1
  •  0
  •   bjauy    7 年前

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

    foreach ($this->attributes as ...

    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;
    }
    
    推荐文章