#php #laravel #laravel-7 #laravel-8
#php #laravel #laravel-7 #laravel-8
Вопрос:
У меня есть старая база данных, где пароли хэшируются с помощью sha3-256. Я создаю новый сайт и должен использовать старую базу данных. Но Auth::attempt() использует bcrypt(по умолчанию). Как я могу установить драйвер хеширования sha3-256?
Комментарии:
1. Вы также можете создать для этого пользовательскую защиту аутентификации, если вы не хотите мигрировать, но я подозреваю, что вы не хотите сохранять устаревшие хэши навсегда, документы об этом здесь: laravel.com/docs/7.x/authentication#adding-custom-guards
Ответ №1:
Предпочтительнее использовать алгоритмы хеширования, поставляемые с Laravel, потому что Laravel поддерживает только Bcrypt и Argon2.
Однако, чтобы помочь вам перейти на новый алгоритм, вы можете в своей таблице Users создать столбец с именем sha3_password, куда вы вводите старый пароль, а при входе в систему вы делаете оператор if, чтобы проверить, не является ли sha3_password ненулевым, и сравнить введенный пароль с вашим sha3-256, если онсовпадения, затем вы обновляете поле пароля пользователя с помощью bcrypt и устанавливаете sha3_password равным null. Таким образом, когда пользователь входит в систему, если это его первый раз, его пароль будет обновлен, иначе войдите в систему нормально.
Я использовал этот метод для переноса проекта, и он работал как шарм, моя функция входа в систему была такой, как показано ниже, вы можете использовать ту же логику в основном :
public function login(Request $request)
{
#Update old password after migration to new platform
$user= User::where('email',request('email'))
->where('password_sha1', sha1(request('password')))
->where('password', null)
->first();
if($user)
{
$user->password = bcrypt(request('password'));
$user->password_sha1 = null;
$user->update();
}
if (Auth::attempt(['email' => request('email'), 'password' => request('password'), 'status' => 1])) {
// Authentication passed...
return redirect($this->redirectPath());
}
}
Комментарии:
1. я бы заменил bcrypt на Hash::make(request(‘password’)) на всякий случай, но это выглядит полезным!