M205 9. Les Middlewares
M205 9. Les Middlewares
M205 9. Les Middlewares
Les middlewares
9. Les middlewares
- Définition
- Création et utilisation d’un middleware
- Attribuer un alia à un middleware
- Middleware global
- Middleware de groupe
2
Définition
▪ Un middleware (traduction textuelle : quelque chose qui est au milieu) est un mécanisme qui permet de filtrer les requêtes http.
Autrement dit, le middleware est une couche placée entre la requête http et la réponse. Elle permet d'effectuer une opération
lorsqu'une condition est rencontrée.
▪ Plusieurs middlewares sont inclus dans le framework Laravel, notamment des middlewares d'authentification et la protection
CSRF. Tous ces middlewares sont situés dans le répertoire app/Http/Middleware.
▪ Par exemple, le middleware auth permet de vérifier si un usager est authentifié avant de donner l'accès à une route donnée. S'il ne
l'est pas, l'usager sera redirigé à une page d'authentification. Tout ceci sans que vous ayez à encombrer vos contrôleurs par une
tonne de code.
3
Création et utilisation d’un middleware
Définition :
Pour créer un nouveau middleware, utilisez la commande Artisan make:middleware :
Exemple:
php artisan make:middleware CheckAge
Cette commande placera une nouvelle classe « CheckAge » dans le répertoire app/Http/Middleware.
Dans cet exemple, on désire ne pas autoriser les
class CheckAge
personnes ayant moins de 18 ans d’accéder à une {
page secrète;
public function handle(Request $request, Closure
On ajoute la logique de traitement dans la méthode $next): Response
handle du middleware crée: {
if($request->has("age") && $request->age<18)
- Si l’age est inférieure à 18, on redirige l’utilisateur
return redirect()->back()->with('error',
à la page précédente avec un message stocké en 'Seuls les personnes âgées de plus de 18 ans sont
autorisés à effectuer cette action.')->withInput();
« error ».
- Sinon, la requête sera transmise à l’application
return $next($request);
pour terminer la demande. }
4
}
Création et utilisation d’un middleware
Utilisation:
Soient deux vues:
- Home.blade.php où on demande à l’utilisateur de donner son age
- Page_secrète.blade.php : La page dont on souhaite contrôler l’accès
CheckAge
Route::view("home", "home");
Route::view("page_secrete", "page_secrete")
->name("page_secrete")
->middleware(CheckAge::class);
6
Affectation à un groupe de routes
▪ Pour affecter un middleware à toutes les routes d'un groupe, vous pouvez utiliser la méthode middleware avant de définir le
groupe.
▪ Les middelwares sont exécutés dans l'ordre dans lequel ils sont répertoriés dans le tableau :
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second middleware...
});
Route::get('/user/profile', function () {
// Uses first & second middleware...
});
});
7
Attribuer un alia à un middleware
• Laravel donne la possibilité d’attribuer des alias (surnoms) aux middlewares dans le fichier
app/Http/Kernel.php de l’application.
• Par défaut, la propriété $middlewareAliases de cette classe contient des entrées pour les
middlewares inclus dans Laravel.
• On peut ajouter un middleware à cette liste et lui attribuer un alias de notre choix :
protected $middlewareAliases = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'age'=> \App\Http\Middleware\CheckAge::class
];
Ainsi, on peut utiliser l'alias lors de l'affectation du middleware aux routes :
Route::view("page_secrete", "page_secrete")
->name("page_secrete")
->middleware('age'); 8
Middleware global
Si on souhaite qu'un middleware s'exécute lors de chaque requête HTTP adressée à l’application, il suffit de répertorier sa classe
dans la propriété $middleware de la classe app/Http/Kernel.php.
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\MaClasseMiddelware::class
];
9
Middleware de groupe
• Parfois, on souhaite regrouper plusieurs middlewares sous une seule clé pour faciliter leur affectation aux routes. On peut
accomplir cela en utilisant la propriété $middlewareGroups de la classe app/Http/Kernel.php.
• Laravel comprend des groupes prédéfinis web et api qui contiennent des middleware communs qu’on peut appliquer à vos routes
Web et API.
les groupes de middlewares facilitent l'affectation simultanée de plusieurs middlewares à une route :
Route::get('/', function () {
// ...
})->middleware('web’);
Route::middleware(['web'])->group(function () {
// ...
10
});
Middleware avec paramètre
▪ Le middleware devrait autoriser les demandes provenant d'une liste d'adresses IP de confiance et refuser les demandes
provenant de toute autre adresse IP.
1. Créez un nouveau middleware en utilisant la commande artisan :
php artisan make:middleware TrustIpMiddleware
2. Ajoutez le code suivant à la méthode handle de la classe TrustIpMiddleware
b. Exemple 2: pour autoriser les demandes provenantes depuis l'adresse IP 192.168.1.100 et 192.168.1.82, on peut écrire :
Route::get('/protege2', function () {
return 'Ceci est une ressource protégée.';
})->middleware('trustip:192.168.1.100, 192.168.1.82’);
Notez:
trustip’ est un alia du middleware : TrustIpMiddleware
12