From 69f61f7ae2f439b0c8c3cb033a7ecea492e50f72 Mon Sep 17 00:00:00 2001 From: Pascal Martineau Date: Thu, 18 Sep 2025 13:34:15 -0400 Subject: [PATCH] feat: Initial middleware --- .../themes/ccat/app/middleware/hasRole.ts | 19 +++++++++++++++++++ .../themes/ccat/app/middleware/isAdmin.ts | 13 +++++++++++++ .../themes/ccat/app/middleware/isLoggedIn.ts | 6 ++++++ .../themes/ccat/app/middleware/isLoggedOut.ts | 6 ++++++ .../themes/ccat/app/pages/devenir-membre.vue | 1 + .../themes/ccat/app/pages/espace-membre.vue | 2 ++ 6 files changed, 47 insertions(+) create mode 100644 wp-content/themes/ccat/app/middleware/hasRole.ts create mode 100644 wp-content/themes/ccat/app/middleware/isAdmin.ts create mode 100644 wp-content/themes/ccat/app/middleware/isLoggedIn.ts create mode 100644 wp-content/themes/ccat/app/middleware/isLoggedOut.ts diff --git a/wp-content/themes/ccat/app/middleware/hasRole.ts b/wp-content/themes/ccat/app/middleware/hasRole.ts new file mode 100644 index 0000000..ac6a831 --- /dev/null +++ b/wp-content/themes/ccat/app/middleware/hasRole.ts @@ -0,0 +1,19 @@ +export default defineNuxtRouteMiddleware((to) => { + const { loggedIn, session } = useUserSession(); + const hasRole = (role: string) => session.value?.user?.roles?.includes(role) || false; + if (!loggedIn.value) { + return navigateTo(`/connexion?redirect=${encodeURIComponent(to.fullPath)}`); + } + if (!to.meta.role) { + throw createError({ statusCode: 500, statusMessage: "Erreur serveur", message: "Le paramètre 'role' est requis (hasRole)." }); + } + if (!hasRole(to.meta.role)) { + throw createError({ statusCode: 403, statusMessage: "Accès refusé", message: `Le rôle '${to.meta.role}' est requis.` }); + } +}); + +declare module "#app" { + interface PageMeta { + role?: string; + } +} diff --git a/wp-content/themes/ccat/app/middleware/isAdmin.ts b/wp-content/themes/ccat/app/middleware/isAdmin.ts new file mode 100644 index 0000000..56bda3b --- /dev/null +++ b/wp-content/themes/ccat/app/middleware/isAdmin.ts @@ -0,0 +1,13 @@ +export default defineNuxtRouteMiddleware((to) => { + const { loggedIn, session } = useUserSession(); + if (!loggedIn.value) { + return navigateTo(`/connexion?redirect=${encodeURIComponent(to.fullPath)}`); + } + const isAdmin = session.value?.user?.roles?.includes("administrator") || false; + if (!isAdmin) { + throw createError({ + statusCode: 403, + statusMessage: "Accès refusé - Privilèges administrateur requis", + }); + } +}); diff --git a/wp-content/themes/ccat/app/middleware/isLoggedIn.ts b/wp-content/themes/ccat/app/middleware/isLoggedIn.ts new file mode 100644 index 0000000..2ecddff --- /dev/null +++ b/wp-content/themes/ccat/app/middleware/isLoggedIn.ts @@ -0,0 +1,6 @@ +export default defineNuxtRouteMiddleware((to) => { + const { loggedIn } = useUserSession(); + if (!loggedIn.value) { + return navigateTo(`/connexion?redirect=${encodeURIComponent(to.fullPath)}`); + } +}); diff --git a/wp-content/themes/ccat/app/middleware/isLoggedOut.ts b/wp-content/themes/ccat/app/middleware/isLoggedOut.ts new file mode 100644 index 0000000..4b13bbb --- /dev/null +++ b/wp-content/themes/ccat/app/middleware/isLoggedOut.ts @@ -0,0 +1,6 @@ +export default defineNuxtRouteMiddleware((to) => { + const { loggedIn } = useUserSession(); + if (loggedIn.value) { + return navigateTo(`/connexion?redirect=${encodeURIComponent(to.fullPath)}`); + } +}); diff --git a/wp-content/themes/ccat/app/pages/devenir-membre.vue b/wp-content/themes/ccat/app/pages/devenir-membre.vue index 5c83b5c..f1508fb 100644 --- a/wp-content/themes/ccat/app/pages/devenir-membre.vue +++ b/wp-content/themes/ccat/app/pages/devenir-membre.vue @@ -1,6 +1,7 @@ diff --git a/wp-content/themes/ccat/app/pages/espace-membre.vue b/wp-content/themes/ccat/app/pages/espace-membre.vue index 822c774..9de0f89 100644 --- a/wp-content/themes/ccat/app/pages/espace-membre.vue +++ b/wp-content/themes/ccat/app/pages/espace-membre.vue @@ -1,6 +1,8 @@