Laravel 7/8. Пользовательский драйвер хэша

#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’)) на всякий случай, но это выглядит полезным!