我可以用Crypt来加密/解密我的数据.我想加密数据库中的一些信息(例如姓名、邮箱、电话号码等).

假设我希望所有内容都被加密,我希望能够在后台自己完成这项工作,我可以通过覆盖createsave函数来完成:

// 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()和all也可以工作.

我还希望在使用关系时扩展此功能(所以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方法"能做到这一点,那就更好了.

推荐答案

加密everything是没有意义的.例如,您永远不想加密主键;这根本说不通.同样,您可能不想加密日期字段;您将无法对它们执行任何类型的SQL查询.

考虑到这一点,你可以try 以下方式:

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的访问器功能,你必须多用一点.

Laravel相关问答推荐

Nuxt 3获取多部分表单数据上传不起作用

Laravel - 出于某种原因,max 打破了我的查询

Laravel 5.8 在从已清除的会话中单击注销后显示419 Page Expired

为什么命令php artisan serve不起作用

Laravel,没有shell 访问的转储自动加载

Laravel 保存一对多关系

Laravel Blade 模板 @foreach 订单

在 Laravel 5 中添加新配置文件不起作用

在 laravel 中更改时区

Laravel 扩展验证自定义消息

需要 Vagrant 环境或目标机器

在 Laravel 中将 Public 添加到assets资源路径

如果值存在于另一个字段数组中,Laravel 验证规则

约定表名(带下划线)

升级到 laravel 5.3 后错误 datetime format: 1292 Incorrect datetime value: '0000-00-00 00:00:00'

laravel 队列 - 同步驱动程序如何工作?它是在单独的进程/线程还是主执行线程中执行?

在 laravel 中安装 vue 3.0

laravel如何访问具有表编号名称的列?

将图像保存在公共文件夹中,而不是存储 laravel 5

Laravel:Redis 无法建立连接:[tcp://127.0.0.1:6379]