setPasswordAttribute 方法的问题

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

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

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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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