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 @@