Exercice - Better Auth — 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
getSessionCookie(better-auth/cookies) pour implémenter la logique suivante :- Les chemins
/,/connexionet/inscriptionsont publics - Toute autre page redirige vers
/connexionsi le cookie de session est absent - Si le cookie de session est présent et que l'utilisateur tente d'accéder à
/connexionou/inscription, le rediriger vers/notes
- Les chemins
- Configurer
matcherpour exclure_next/static,_next/image,favicon.icoetapi
- Utiliser
- Ajouter un champ additionnel
role(valeurs possibles :"utilisateur"ou"admin") au modèleuserviauser.additionalFieldsdanslib/auth.ts, avec"utilisateur"commedefaultValueetinput: false; régénérer le schéma avecnpx auth@latest generateet appliquer la migration - Ajouter
inferAdditionalFields<typeof auth>()au client (lib/auth-client.ts) pour que TypeScript connaisse le champrole - Créer la section d'administration :
app/admin/page.tsx: vérifier avecauth.api.getSessionque l'utilisateur est connecté et quesession.user.rolevaut"admin", sinon rediriger vers/acces-refuse; afficher la liste de tous les utilisateurs (requête Prisma sans filtre sur la tableuser)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.api.getSessionque la note appartient bien à l'utilisateur connecté avant de la supprimer (protection contre la suppression d'une note appartenant à quelqu'un d'autre)