Laravel

Middleware

Un Middleware permet de filtrer les requêtes HTTP entrantes dans l'application. Il se place entre la requête et le reste de l'application.

Il permet de lire les informations de la requête et de faire des actions suivant ces informations.

Par défaut, Laravel est livré avec plusieurs Middleware. Nous avons déjà utilisé le auth qui permet de rediriger les utilisateurs non identifiés vers la page de connexion.

Kernel.php

Les Middleware sont déclarés dans le fichier app/Http/Kernel.php

Il y a 3 tableaux dans ce fichier qui correspondent à 3 types de déclarations.

  • $middleware ⇒ liste les Middleware qui fonctionnent par défaut sur toute l’application
  • $middlewareGroups ⇒ liste les Middleware qui pourront être associés à des groupes de routes.
  • $routeMiddleware ⇒ liste les Middleware qui pourront être associés à différentes routes, qu’elles soient en groupe ou qu’elles soient individuelles.

On peut voir dans le tableau $routeMiddleware qu'il y a auth, c'est le middleware qui est utilisé quand on appelle la méthode $this→middleware('auth') dans le contrôleur ou dans une route.

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ...
];

Donc quand on appelle auth, ça charge le fichier /app/Http/Middleware/Authenticate.php

Les Middleware sont dans le dossier /app/Http/Middleware

Créer un Middleware

Création d'un Middleware Admin qui permettra de savoir si l'utilisateur connecté est un administrateur

Pour créer le fichier, on peut utiliser php artisan

php artisan make:middleware Admin

Il y a maintenant un fichier dans /app/Http/Middleware

Ajout du code pour vérifier si l'utilisateur est un administrateur. Le code doit être ajouté dans la méthode handle()

public function handle($request, Closure $next)
    {
        $user = $request->user();

        if ($user && $user->admin) {
            return $next($request);
        }

        return redirect()->route('home');
    }

  • Ligne 3 ⇒ mettre les informations de l'utilisateur connecté dans $user
  • Ligne 5 ⇒ vérifie que l'utilisateur existe et est un administrateur
  • Ligne 6 ⇒ continue la route normale de la requête
  • Ligne 9 ⇒ bloque la requête et redirige vers la page d'accueil

$user→admin est expliqué dans le chapitre sur les modèles Getter et Setter

Ajout du Middleware dans le Kernel.php

il faut maintenant ajouter le Middleware que l'on vient de créer dans le fichier Kernel.php

protected $routeMiddleware = [
...
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'admin' => \App\Http\Middleware\Admin::class,
    ];

Utilisation

Pour utiliser ce nouveau middleware, on peut l'ajouter à une route par exemple

...
Route::middleware('admin')->prefix('admin')->group(function () {
    Route::resource ('user', 'UserController');
});
...

Pour accéder au UserController, il faut que l'utilisateur connecté soit un administrateur.