setPasswordAttribute 方法的问题

按照书中例子,在setPasswordAttribute()加入以下代码:

    if (strlen($value) != 60) {
        $value = bcrypt($value);
    }

    $this->attributes['password'] = $value;

之后发现,修改password没有问题了。但是你如果尝试修改其他内容,比如用户名、邮箱、头像,选任何一个都可以。修改,保存。然后刷新数据库,发现数据库里该用户的密码一栏值变化了。尽管你没有修改密码,但是再用原来的密码已经无法登录了。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

我测试了,先修改password,保存,再修改用户名,保存,用第一步修改的password仍可以登录,并不会有问题。而且数据库加密的密码变化是因为加密算法的salt导致的。可以参考

5年前 评论

先感谢你的回复。
用你说的步骤操作,没问题。

试试如下步骤,就出事了:
进入管理后台,选择一个账号,上去直接修改用户名(只改用户名,别动任何其他项)。退出,用该账号登录。结果无法登录了。

5年前 评论

修改器里加个条件判断就行了

if (empty($value)) {
    return;
}
5年前 评论

@hustnzj 你操作姿势不对,因为你么刷新页面。刷新页面执行这两步操作就会发现密码改变了

5年前 评论

@小李飞叨 楼上是正解,如果传入的是空值,则return修改器,也就是说相当于这个属性修改无效

5年前 评论

感谢分享!是要加个防空判断

$c= strlen($value);
if($c && $c!=60){   // 此判断允许使用数字 0 作为密码
    ...
}
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!