Tests RBAC — validation empirique et 3 bugs réels trouvés¶
Contexte¶
Script de test BackEnd/tests/rbac/test-rbac.sh créé le 2026-06-23 pour
vérifier que chaque profil de
ProjetESM/architecture/systeme-rbac-permissions accède uniquement aux
routes autorisées — ni plus, ni moins. Simule 8 utilisateurs réels
(comptes de test dédiés) qui se connectent via JWT et appellent les
routes clés du backend, en vérifiant les codes HTTP (200 attendu / 403
attendu).
Contenu¶
Méthode¶
- Comptes de test : un par profil (PSYCHOLOGUE, ASSISTANT_SOCIAL,
MEAL_COMMUNAL, MEAL_NATIONAL, CHARGE_PROJET, BAILLEUR, ADMIN,
SUPER_ADMIN), réinitialisables via
BackEnd/prisma/create-comptes-test.ts. - Pour chaque profil : connexion → JWT → appel des routes autorisées (200 attendu) et des routes interdites (403 attendu).
- Limitation connue : rate limiter auth à 10 requêtes/15 min par IP — lancer toutes les connexions en une seule passe pour éviter un blocage 429.
Résultat final : 66/66 tests passants — RBAC conforme¶
Mais ce résultat final masque 3 bugs réels trouvés uniquement parce que le test a été exécuté contre le vrai comportement, pas supposé conforme sur la seule base du seed :
v1 (2026-06-23) — faux positif initial sur BAILLEUR/MOBILISATION_LIRE
: erreur dans le script de test lui-même, pas dans le RBAC (BAILLEUR
possède légitimement cette permission).
v2 (2026-06-23) — erreur grave : PSYCHOLOGUE et ASSISTANT_SOCIAL
avaient été à tort exclus de INDICATEUR_LIRE/INDICATEUR_SAISIR, alors
que ce sont eux qui saisissent réellement les indicateurs au niveau
communal. Corrigé dans seed.ts + appliqué en base + routeur frontend
corrigé.
v3 (2026-06-26) — bug de scope de données, plus subtil que le
RBAC lui-même : les requêtes de rapports filtraient systématiquement par
idUtilisateur, quel que soit le rôle. Trois scopes distincts corrigés :
- scope global (aucun filtre) pour SUPER_ADMIN/ADMIN/MEAL_NATIONAL/CHARGE_PROJET/DIRECTION
- scope commune (communeCode) pour MEAL_COMMUNAL/COORDINATEUR_LOCAL
- scope personnel (idUtilisateur) pour les agents de terrain
Plus un bug d'accès UI associé : la route /pilotage/saisies-equipe
était protégée par ROLES_COORD_ET_ADMIN, bloquant à tort les agents de
terrain qui devaient pourtant y accéder (scope commune propre) —
déplacée vers ROLES_AVEC_PILOTAGE.
Point de vigilance non résolu¶
BAILLEUR a la permission RAPPORT_EXPORTER mais le scope actuel ne
lui retourne que ses données personnelles (idUtilisateur), pas des
agrégats nationaux. À trancher : le bailleur doit-il voir des agrégats
consolidés ? Si oui, l'ajouter à ROLES_GLOBAL dans
RapportsRepositoryPrisma.ts.
Décision / Conclusion¶
Les 3 corrections (v1 faux positif écarté, v2 permissions manquantes ajoutées, v3 bug de scope de données corrigé) confirment une leçon méthodologique : un RBAC qui "passe tous les tests" sur le papier (permissions correctement assignées) peut quand même exposer les mauvaises données si le scope de filtrage n'est pas testé indépendamment des permissions elles-mêmes. Le test de conformité RBAC doit couvrir à la fois "qui a le droit d'appeler la route" (403/200) ET "quelles données la route renvoie effectivement" (scope), pas seulement le premier.
À faire¶
- Trancher le point de vigilance BAILLEUR (agrégats nationaux ou données personnelles).
- Resynchroniser
seed.tsavec les permissions ajoutées directement en base (INSERTION_MODIFIER,CONCERTATION_GERER) pour éviter une régression au prochaindb push. - Relancer ce script après toute modification touchant une route, le middleware
autoriser.middleware.ts, les permissions d'un profil, ou avant tout déploiement manuel.
Liens connexes¶
- ProjetESM/architecture/systeme-rbac-permissions — conception du RBAC testé ici
- ProjetESM/debug/conformite-modules-backend — autres vérifications de conformité backend de la même période
- ProjetESM/index — index du projet