Authentifier nos utilisateurs

Ce tutoriel va être un peu plus compliqué que les autres si vous n'avez pas de bonnes connaissances en programmation orienté objet avec PHP. nous allons utiliser le système d'authentification de Laravel pour vérifier les identifiants de nos utilisateurs.

Accéder au système d'authentification

Comme pour la requête de l'utilisateur avec la fonction request(), Laravel nous fournit une fonction pour récupérer le système d'authentification : auth().

Nous pouvons utiliser beaucoup de méthode après cette fonction mais celle qui nous intéresse est la méthode attempt() qui permet d'essayer d'authentifier un utilisateur via des paramètres. Si l'authentification réussit, l'utilisateur sera stocké en session et pourra naviguer sur les pages protégées du site, si elle échoue, la fonction retourne false.

Les paramètres de la fonction attempt()

La fonction prend en paramètre un tableau contenant à la clé password le mot de passe renseigné, et toutes les autres clés doivent correspondre à des colonnes de la base de données : dans notre cas, seulement la colonne email.

auth()->attempt([
    'email' => request('email'),
    'password' => request('password'),
]);

Cela peut paraître étrange car nous utilisons password à la place de mot_de_passe en clé du tableau mais c'est normal. Nous verrons plus tard où renseigner le nom de la colonne du mot de passe.

Configuration du modèle à utiliser

Si nous essayons de nous connecter avec un compte existant dans la base de données, nous obtenons une erreur SQL comme quoi la table users n'existe pas. Par défaut, Laravel va utiliser le modèle app/User.php à la place de notre modèle app/Utilisateur.php.

Pour configurer cela, nous devons aller dans config/auth.php et remplacer App\User::class par App\Utilisateur::class.

Rendre notre utilisateur Authenticatable

Nous obtenons maintenant une erreur sur le fait que notre classe App\Utilisateur n'est pas une instance de l'interface Illuminate\Contracts\Auth\Authenticatable. Pour remédier à cette erreur, nous devons implémenter l'interface dans notre modèle.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;

class Utilisateur extends Model implements Authenticatable
{
    protected $fillable = ['email', 'mot_de_passe'];
}

L'interface Authenticatable contient 6 méthodes obligatoires. Nous pourrions écrire toutes ces méthodes à la main, mais Laravel nous fournit un trait que nous pouvons utiliser.

Ce trait s'appelle également Authenticatable, nous devons donc changer son nom avec as pour pouvoir l'utiliser.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Auth\Authenticatable as BasicAuthenticatable;

class Utilisateur extends Model implements Authenticatable
{
    use BasicAuthenticatable;

    protected $fillable = ['email', 'mot_de_passe'];
}

Vous pouvez voir les méthodes apportées par ce trait dans le fichier vendor/laravel/framework/src/Illuminate/Auth/Authenticatable.php. La plupart des méthodes par défaut sont correctes, sauf la méthode getAuthPassword() qui retourne $this->password, or, notre modèle ne possède pas de colonne password, nous devons donc réécrire cette méthode pour retourner $this->mot_de_passe.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Auth\Authenticatable as BasicAuthenticatable;

class Utilisateur extends Model implements Authenticatable
{
    use BasicAuthenticatable;

    protected $fillable = ['email', 'mot_de_passe'];

    /**
     * Get the password for the user.
     *
     * @return string
     */
    public function getAuthPassword()
    {
        return $this->mot_de_passe;
    }
}

Les autres méthodes sont correctes, sauf les dernières méthodes concernant le bouton « Se souvenir de moi » (rememberToken). Comme pour la colonne password, nous ne possèdons pas de colonne remember_token. Mais comme nous n'utilisons pas cette fonctionnalité, ne rien changer ne devrait pas poser de problème.

Voilà pour ce tutoriel un peu plus compliqué que les précédents, si tout n'est pas clair pour le moment, je vous conseille d'en apprendre plus sur la programmation orienté objet en PHP. La suite sera plus simple, vous pouvez donc continuer à suivre ce guide avec le code que je vous ai donné ici.