Amélioration de la gestion des mots de passe

L’Onironaute possède déjà son système de gestion de mots de passe (Assez simpliste), basé sur un simple hash md5. Laravel, quant à lui, utilise Bcrypt, qui est beaucoup plus fiable. Il me faudra donc faire en sorte de modifier le système d’authentification.

Mais comment faire puisque, par définition, je ne connais pas les mots de passe (puisque hashés) des utilisateurs ?

Je suis parti du principe suivant :

  • Je garde les mots de passe actuels et le système actuel, en parallèle du système de Laravel
  • Lors du login (réussi) d’un utilisateur, je réencode le mot de passe en clair, puis j’active un flag sur le compte utilisateur
  • Si ce flag est activé, je ne cherche plus à essayer de vérifier avec l’ancienne méthode.

Après avoir regardé une question similaire sur StackOverflow, j’ai modifié les méthodes de Laravel comme suit :

  • Copier la méthode login() depuis vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticateUsers.php vers Http/Controllers/Auth/AuthController.php
  • Dans Http/Controllers/Auth/AuthController.php, rajouter :
    • use Illuminate\Support\Facades\Auth as fAuth ;
    • use Hash ;
  • Toujours dans le même fichier, remplacer ceci :
    if (Auth::guard($this->getGuard())->attempt($credentials, $request->has('remember'))) {
        return $this->handleUserWasAuthenticated($request, $throttles);
    }
  • Par ceci :
            if (fAuth::guard($this->getGuard())->attempt($credentials, $request->has('remember'))) {
                return $this->handleUserWasAuthenticated($request, $throttles);
            } else {
                $user = User::where('email', $request->email)->first();
                if ($user && $user->password == md5($request->password) && !$user->is_new_password) {
                    $user->password        = Hash::make($request->password);
                    $user->is_new_password = true;
                    $user->save();
                    if (fAuth::guard($this->getGuard())->attempt($credentials, $request->has('remember'))) {
                        return $this->handleUserWasAuthenticated($request, $throttles);
                    }
                }
            }

Voici le principe de fonctionnement :

  • On tente en premier lieu d’authentifier avec la méthode de Laravel
  • En cas d’échec, et si le flag « is_new_password » vaut false, on tente de vérifier le md5 du mot de passe actuel
  • S’ils concordent, on met le compte utilisateur à jour avec la nouvelle gestion de mot de passe, on passe le flag à true, et on réauthentifie l’utilisateur.

Bien entendu, j’ai ajouté la colonne « is_new_password » à mes migrations :
$table->boolean('is_new_password')->index();

Laissez votre commentaire