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ôle | Description |
|---|---|
USER | Compte standard — accès à l'espace personnel /account uniquement |
MODERATOR | Staff limité — accès /account + panneau Administration restreint |
ADMIN | Accès complet — tous les menus et routes |
Navigation
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 :
| Action | Route | Guard |
|---|---|---|
| Supprimer l'avatar d'un user | DELETE /api/admin/users/[id]/avatar | moderator: true |
| Voir la timeline / audit | GET /api/admin/users/[id]/timeline | moderator: true |
| Voir les notes | GET /api/admin/users/[id]/notes | moderator: true |
| Voir les crédits | GET /api/admin/users/[id]/credits | moderator: true |
Les actions destructives (block, revoke, delete, changement de rôle, export RGPD) restent ADMIN uniquement.
Matrice des permissions
Panneau Administration (UserShell)
| Menu | ADMIN | MODERATOR |
|---|---|---|
| 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.
Sidebar admin (sidebar.tsx)
ADMIN_ONLY_HREFS filtre les liens affichés dans le DashboardShell
pour les MODERATORs. Doit rester en sync avec proxy.ts.
Sidebar user (user-sidebar.tsx)
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
- Dashboard admin — sections et impersonation
- Audit log — toutes les actions sont tracées
- Compte utilisateur — espace personnel