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