шифровать пароли в Laravel для уже созданных пользователей - PullRequest
1 голос
/ 23 сентября 2019

Мы обнаружили ошибку в нашем API, которая позволяла некоторым пользователям регистрироваться с простым паролем (хотя для них логин не работает)

Он не был зашифрован как bcrypt($password) и сохранен в Mongodb с помощьюиспользуйте пакет Jenssegers \ Mongodb.

Я узнал, как выбрать этих пользователей в Mongodb

db.getCollection('users').find({ 
    "$expr": { "$lt": [ { "$strLenCP": "$password" }, 11 ] } 
})

Как я могу сделать то же самое в tinker, обновить пароль всех этих пользователей и сохранитьэто снова?

1 Ответ

1 голос
/ 23 сентября 2019

Необработанные выражения вводятся непосредственно в запрос.Можно было бы написать запрос в PHP, подобный этому.

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

Проверьте правильность результатов выполнения запроса, затем выполните следующую команду для обновления документов.

Обязательно протестируйте копию базы данных перед запуском на действующей.

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();
}
...