Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Laravel
  3. Authentification et autorisations
Extrait - Laravel Un framework efficace pour développer vos applications PHP (2e édition)
Extraits du livre
Laravel Un framework efficace pour développer vos applications PHP (2e édition) Revenir à la page d'achat du livre

Authentification et autorisations

Démarrer rapidement

Les applications et les sites web proposent souvent un système d’authentification pour délimiter les espaces publics et les espaces privés. Sur le site d’une banque en ligne, l’espace client est un espace protégé : seuls les utilisateurs connectés y ont accès. On peut également imaginer que ce site est administré par une DSI au sein de la banque, qui elle aussi aura un espace privé pour effectuer des actions de maintenance sur le site. Enfin, les responsables d’agences auront aussi un espace propre, permettant de gérer leur portefeuille client.

Pour se rendre dans son espace privé, chaque acteur devra donc s’authentifier, c’est-à-dire indiquer généralement une adresse e-mail et un mot de passe. Ensuite intervient la notion d’autorisation : un administrateur n’aura pas les mêmes privilèges qu’un client. Certaines personnes peuvent accéder à des espaces ou à certaines ressources, auxquels d’autres n’ont pas le droit d’accéder.

Dans ce chapitre, nous partirons sur une nouvelle installation de Laravel, en incluant les services mysql et mailpit. Vous pouvez vous référer au chapitre Installation et configuration pour plus de détails.

Commande pour la création d’un nouveau projet Laravel avec Sail

curl -s "https://laravel.build/auth?with=mysql,mailpit" | bash 

Mailpit est un service qui intercepte les e-mails envoyés par l’application. Cela nous permettra de prévisualiser les e-mails sans configuration supplémentaire dans notre environnement de développement local. Lorsque Sail est lancé, l’interface de mailpit est accessible à l’adresse http://localhost:8025.

1. Installation de Laravel Breeze

Laravel met à disposition, sous forme de package composer, trois starter kits (kits de démarrage) pour la gestion de l’authentification. Comme son nom l’indique, il n’est pas recommandé d’installer un de ces starters kit sur autre chose qu’une nouvelle installation de Laravel, car les modifications qu’elles apportent peuvent entraîner des effets de bords avec des développements existants.

Particularité de ces trois packages :...

Paramétrage avancé

Laravel permet de mettre rapidement en place un système d’authentification complet. Cependant, il est assez générique. Il faudra parfois le personnaliser pour répondre aux besoins spécifiques de votre application.

Les paragraphes suivants donnent quelques exemples de personnalisation de l’authentification pour illustrer ce point : envoi d’un e-mail de bienvenue, demande de renseignement d’un numéro de téléphone à l’inscription, etc.

1. Personnaliser le mail de réinitialisation de mot de passe

Quand un utilisateur non connecté se rend sur la page /forgot-password et demande la réinitialisation de son mot de passe, Laravel lui envoie un e-mail, à travers son système de notification.

Pour personnaliser cet e-mail, ajoutez une méthode sendPasswordResetNotification dans le modèle User et appelez la notification désirée.

Vous apprendrez à créer une notification dans le chapitre Envoyer des e-mails. Vous pouvez d’ores et déjà lancer la commande sail artisan make:notification avec un nom de notification en paramètre.

Utiliser une notification personnalisée dans la classe App\Models\User

public function sendPasswordResetNotification($token): void 
{ 
 
    $this->notify(new MyResetPasswordNotification($token)); 
 
}  

2. Événements et écouteurs : envoyer un e-mail de bienvenue

Sur un site web, il est assez courant d’envoyer un e-mail de bienvenue quand un utilisateur crée un compte. Que ce soit avec des services comme Mailchimp, Intercom ou directement avec le système d’adresse e-mail de Laravel, il faudra signaler au framework quoi faire quand l’utilisateur est créé.

Laravel propose un système d’événements simples donc certains sont déjà paramétrés. Par exemple, dans le cas d’une création de compte, un événement Registered est émis. Il est possible de brancher plusieurs écouteurs sur cet événement. On peut imaginer envoyer un message de bienvenue, mais aussi créer une référence à l’utilisateur dans un service externe comme Salesforce...

Autres méthodes d’authentification

Le système d’authentification présenté précédemment suffira à démarrer dans la plupart des cas. Il permet d’inscrire et de connecter des utilisateurs afin de protéger certaines routes. Cependant, il est également possible d’utiliser d’autres méthodes d’authentification présentées dans la suite de ce chapitre.

1. Laravel Socialite

Laravel Socialite (https://github.com/laravel/socialite) est une bibliothèque qui fournit une interface de connexion avec Facebook, Twitter, Google, LinkedIn, GitHub et Bitbucket. Il s’agit d’une bibliothèque officielle permettant l’utilisation de raccourcis du type « connexion avec Facebook ». Son utilisation est assez simple, mais nécessite au préalable de créer une application dans l’un des réseaux sociaux listés ci-dessus, ce qui dépasse le cadre de ce livre.

Pour commencer, installez Laravel Socialite avec Composer.

Installation de Socialite

sail composer require laravel/socialite  

Ensuite, configurez Socialite en ajoutant dans le fichier de configuration config/services.php les informations nécessaires au lien vers le réseau social.

Dans l’exemple de GitHub, nous devons récupérer un identifiant client et une clé secrète que nous renseignerons dans notre application à travers une variable d’environnement.

Configuration de GitHub dans config/services.php

return [ 
 
    // ... 
 
    'github' => [ 
        'client_id' => env('GITHUB_CLIENT_ID'), ...

Déconnexion

Quand un utilisateur est authentifié avec une méthodes indiquée précédemment dans ce chapitre, il reste authentifié pour la durée de sa session. Cela signifie que tant qu’il continue à naviguer sur le site, l’utilisateur reste connecté. Il est préférable de donner aux utilisateurs un moyen de se déconnecter manuellement. Pour cela, il faudra créer un lien de déconnexion quelque part dans votre application, puis la route correspondante et une méthode dans un contrôleur pour effectuer la déconnexion. Par défaut, Laravel a déjà créé tout cela si vous avez procédé à l’installation de Laravel Breeze (voir la première partie de ce chapitre). Une route /logout est donc probablement disponible et la gestion de la déconnexion est déjà entièrement fonctionnelle. Cependant, il est possible de déconnecter manuellement un utilisateur en utilisant la méthode Auth::logout. La documentation de Laravel recommande d’aller plus loin en invalidant la session de l’utilisateur et en générant un nouveau token CSRF.

Déconnexion d’un utilisateur

public function logout(Request $request): RedirectResponse 
{ 
 
    Auth::logout(); 
 
    $request->session()->invalidate(); ...

Rappels sur la sécurité

1. Mots de passe

Pour la sécurité des utilisateurs et de votre application, les mots de passe doivent toujours être hachés. Autrement dit, ils ne doivent ni être stockés en clair dans la base de données ni être encodés : ils doivent être hachés pour être indéchiffrables.

Pour rappel, une application doit toujours transformer les mots de passe pour qu’ils soient inconnus des développeurs ou des administrateurs, de la base de données, des logs et des attaquants potentiels. Pour faire simple, personne ne doit être en mesure de retrouver la valeur réelle d’un mot de passe. Ils doivent donc être transformés à l’aide d’une fonction à sens unique (sans possibilité de décryptage) avant leur enregistrement dans la base de données. La valeur hachée dans la base de données sera comparée à la valeur hachée du mot de passe fourni par l’utilisateur lors d’une tentative de connexion.

Plus d’information à propos du hachage ici : https://fr.wikipedia.org/wiki/Fonction_de_hachage_cryptographique

Par défaut, dans les instructions en début de chapitre consacré au démarrage rapide, Laravel a déjà mis en place le système de hachage. Pour le constater, allez...

Autorisations

Comme déjà vu dans ce chapitre, l’authentification permet de délimiter deux espaces : un espace public accessible aux utilisateurs non connectés et un espace privé accessible aux utilisateurs connectés. C’est un premier pas vers une politique d’autorisation, mais il n’est pas suffisant.

En effet, lorsqu’un espace privé a été identifié, il peut rapidement sembler intéressant de le subdiviser en d’autres espaces restreints à tel ou tel utilisateur selon certaines règles métier. De plus, l’accès aux ressources doit être contrôlé en fonction des autorisations.

Dans un forum par exemple, tout le monde peut consulter un message, mais seuls son auteur et les administrateurs peuvent le modifier. De la même manière, sur un site de partage de documents, on pourrait imaginer que seuls les membres d’un même groupe peuvent accéder à un dossier spécifique. Enfin, sur un site de vente de particulier à particulier, seul le vendeur peut supprimer un élément de sa boutique, les autres se contentent de le consulter ou d’y laisser un commentaire.

Laravel fournit un système simple pour gérer les autorisations à travers deux approches : les portes (Gates) pour les autorisations générales et les politiques (Policies) pour le contrôle d’accès aux ressources. Les deux approches sont complémentaires et peuvent être utilisées en parallèle. Pour une petite application, il est possible de ne sélectionner qu’une seule approche. Les policies deviennent incontournables du moment où l’application monte en complexité.

1. Gates

Le système des gates est simple dans Laravel : on déclare une porte (gate) en décrivant ses règles, et ensuite on intègre cette porte dans le code pour protéger certaines parties de l’application.

a. Déclarer une porte

Pour déclarer une porte, appelez Gate::define dans la méthode boot de la classe App\Providers\AuthServiceProvider en passant en paramètre un nom et une fonction de rappel. Le nom permet d’identifier la porte et de l’utiliser par la suite. Le choix du nom est libre, essayez...