为已创建的用户加密 Laravel 中的密码

encrypt passwords in Laravel for users already created

我们在 API 中发现了一个错误,它允许一些用户使用纯密码注册(但登录对他们不起作用)

它没有像 bcrypt($password) 那样加密,而是使用 Jenssegers\Mongodb 包保存在 Mongodb 中。

我找到了如何 select Mongodb

中的那些用户
db.getCollection('users').find({ 
    "$expr": { "$lt": [ { "$strLenCP": "$password" }, 11 ] } 
})

如何在 tinker 中执行相同操作并更新所有这些用户的密码并再次保存?

Raw expressions 直接注入到查询中。可以在 PHP 中编写与此类似的查询。

$users = User::whereRaw([
    '$expr' => ['$lt' => [['$strLenCP' => "$password"], 11 ]] 
])->get();

检查 运行 查询结果是否正确,然后 运行 更新文档。

Make sure to test on a database copy before running on the live one.

foreach($users as $user) {
    User::where('_id', $user['_id'])
    ->update(
        ['password' => Hash::make($user['password'])]
    );
}

或者,获取所有用户并在内存中执行过滤。

$users = User::all();

$updateUsers = [];
foreach ($users as $user) {
    if(mb_strlen($user->password, "UTF-8") < 11) {
        $updateUsers[] = $user; 
    }
}

然后更新筛选的用户,

foreach($updateUsers as $user) {
    $user->password = bcrypt($user->password);
    $user->save();
}