Documentation

Rôles & permissions

Gestion des rôles USER, MODERATOR et ADMIN — accès sidebar, panneaux et routes protégées.

NexVault dispose de trois rôles : USER, MODERATOR et ADMIN. La logique d'accès est double : côté serveur dans proxy.ts (redirection HTTP) et côté client dans les sidebars (liens filtrés).

Rôles disponibles

RôleDescription
USERCompte standard — accès à l'espace personnel /account uniquement
MODERATORStaff limité — accès /account + panneau Administration restreint
ADMINAccès complet — tous les menus et routes

Espace utilisateur (/account)

Tous les rôles atterrissent sur UserShell (sidebar user). Le panneau Administration (slide-in, comme le panneau Développeur) est affiché uniquement pour ADMIN et MODERATOR.

Le panneau Administration est accessible via le bouton en bas de la sidebar user — il slide depuis la droite avec un bouton retour.

Dashboard admin (/admin)

Le DashboardShell (sidebar admin complète) est affiché pour ADMIN et MODERATOR sur toutes les routes /admin/*, /settings, /plans, etc. Les liens sont filtrés selon le rôle (voir tableau ci-dessous).

Actions modérateur

Les MODERATORs ont accès en écriture à certaines actions sur les users :

ActionRouteGuard
Supprimer l'avatar d'un userDELETE /api/admin/users/[id]/avatarmoderator: true
Voir la timeline / auditGET /api/admin/users/[id]/timelinemoderator: true
Voir les notesGET /api/admin/users/[id]/notesmoderator: true
Voir les créditsGET /api/admin/users/[id]/creditsmoderator: true

Les actions destructives (block, revoke, delete, changement de rôle, export RGPD) restent ADMIN uniquement.

Matrice des permissions

Panneau Administration (UserShell)

MenuADMINMODERATOR
Dashboard✅✅
Utilisateurs✅✅
Audit✅✅
Sessions✅✅
Billing✅✅
Coupons✅✅
Logs emails✅✅
Système✅✅
Analytiques✅❌
Broadcasts✅❌
Annonces✅❌
Plans✅❌
Credit packs✅❌
Offrir des crédits✅❌
Emails (templates)✅❌
Feature flags✅❌
Jobs✅❌
Chat IA✅❌
Paramètres✅❌

Les liens ADMIN-only sont regroupés dans une section séparée « Admin » dans le panneau, invisibles pour les MODERATORs.

Implémentation

Middleware (proxy.ts)

Deux listes contrôlent les redirections HTTP pour les non-admins :

// Bloque le préfixe ET tous ses sous-chemins
const adminOnlyPrefixes = [
  "/settings", "/plans", "/credit-packs",
  "/admin/credits", "/admin/analytics",
  "/admin/feature-flags", "/admin/jobs",
  "/admin/chat", "/broadcasts", "/announcements",
];

// Bloque le chemin exact seulement (les sous-chemins peuvent être partagés)
// Ex : /admin/emails est admin-only, mais /admin/emails/logs est partagé
const adminOnlyExact = ["/admin/emails"];

Un MODERATOR qui tente d'accéder à un chemin admin-only est redirigé vers /admin.

ADMIN_ONLY_HREFS filtre les liens affichés dans le DashboardShell pour les MODERATORs. Doit rester en sync avec proxy.ts.

buildAdminLinks() → liens communs ADMIN + MODERATOR. buildAdminOnlyLinks() → liens ADMIN uniquement (section « Admin »). Les deux fonctions acceptent billingEnabled et creditsEnabled pour les liens conditionnels.

Synchronisation automatique du rôle

Le rôle est relu depuis la base de données à chaque refresh du JWT (chaque appel à auth() côté serveur). Idem pour name et image.

Conséquence : si un admin change le rôle d'un utilisateur en base, le changement est effectif sans déconnexion dès la prochaine navigation.

// lib/auth.ts — jwt callback, refresh path
if (dbUser.role) token.role = dbUser.role;
if (dbUser.name !== undefined) token.name = dbUser.name;
if (dbUser.image !== undefined) token.picture = dbUser.image;

Assigner un rôle

Depuis le panel admin → Utilisateurs → ouvrir la fiche user → onglet Actions → changer le rôle.

Ou directement en base :

UPDATE "User" SET role = 'MODERATOR' WHERE email = 'user@example.com';

Aller plus loin

On this page