Exercice - Auth.js — Protection des routes¶
Ajouter une protection centralisée des routes et un accès par rôle à l'application de gestion de notes :
- Créer le fichier
middleware.tsà la racine du projet :- Utiliser la forme étendue (
auth((req) => { ... })) pour implémenter la logique suivante :- Les chemins
/,/connexionet/inscriptionsont publics - Toute autre page redirige vers
/connexionsi l'utilisateur n'est pas connecté - Si l'utilisateur est connecté et tente d'accéder à
/connexionou/inscription, le rediriger vers/notes
- Les chemins
- Configurer
matcherpour exclure_next/static,_next/image,favicon.icoetapi
- Utiliser la forme étendue (
- Ajouter un champ
role(valeurs possibles :"utilisateur"ou"admin") au modèle PrismaUtilisateuravec"utilisateur"comme valeur par défaut ; appliquer la migration - Propager le rôle dans la session :
- Ajouter
role: stringdanstypes/next-auth.d.ts - Retourner le
roledans la fonctionauthorizedeauth.ts - Ajouter les callbacks
jwtetsessionpour propagertoken.roleverssession.user.role
- Ajouter
- Créer la section d'administration :
app/admin/page.tsx: vérifier avecauth()que l'utilisateur est connecté et que son rôle est"admin", sinon rediriger vers/acces-refuse; afficher la liste de tous les utilisateurs (requête Prisma sans filtre)app/acces-refuse/page.tsx: page simple affichant un message d'accès refusé avec un lien vers/notes
- Modifier manuellement le rôle d'un utilisateur dans Prisma Studio (
npx prisma studio) pour le passer à"admin"et vérifier que la page/admindevient accessible - Ajouter une Server Action
supprimerNote(id: number)dans laquelle vous vérifiez avecauth()que la note appartient bien à l'utilisateur connecté avant de la supprimer (protection contre la suppression d'une note appartenant à quelqu'un d'autre)