Rapport de tests RBAC — Plateforme ESM¶
Date : 2026-06-23
Mis à jour : 2026-06-26 (corrections scope données pilotage + accès saisies-équipe agents terrain)
Méthode : Tests API directs (curl + JWT) sur backend http://localhost:4100
Résultat global : 66/66 tests — RBAC 100% conforme
⚠ Correction v2 (2026-06-23) : PSYCHOLOGUE et ASSISTANT_SOCIAL avaient été à tort exclus de
INDICATEUR_LIREetINDICATEUR_SAISIR. Ces permissions ont été ajoutées au profilagentTerraindansseed.ts, appliquées en base, et le routeur frontend a été corrigé. Ce sont eux qui saisissent les indicateurs au niveau des communes.⚠ Corrections v3 (2026-06-26) — Scope des données et accès pilotage : 1. saisies-equipe inaccessible aux agents terrain : le frontend redirigeait PSYCHOLOGUE et ASSISTANT_SOCIAL vers le tableau de bord car la route
/pilotage/saisies-equipeétait protégée parROLES_COORD_ET_ADMIN. Corrigé : route déplacée versROLES_AVEC_PILOTAGE, onglet visible à tous les profils pilotage, lien sidebar déverrouillé. 2. Tableau de bord vide pour SUPER_ADMIN/ADMIN/MEAL_NATIONAL : les requêtes rapports filtraient paridUtilisateurpour tous les rôles. Les rôles superviseurs (SUPER_ADMIN, ADMIN, MEAL_NATIONAL, CHARGE_PROJET, DIRECTION) voient désormais toutes les données sans filtre (scope global). 3. MEAL_COMMUNAL ne voyait que ses propres saisies : même problème de scope. MEAL_COMMUNAL filtre désormais parcommuneCode(enfants, formations, maîtres coraniques) ou parutilisateur.communeCode(accompagnements, suivis) — toute leur commune.
Matrice de visibilité des données — Pilotage & Rapports¶
| Rôle | Saisies équipe (saisies-detail) |
Tableau de bord rapports | Périmètre données |
|---|---|---|---|
| PSYCHOLOGUE | ✅ Commune propre | ❌ (pas RAPPORT_EXPORTER) | utilisateur.communeCode |
| ASSISTANT_SOCIAL | ✅ Commune propre | ❌ (pas RAPPORT_EXPORTER) | utilisateur.communeCode |
| MEAL_COMMUNAL | ✅ Commune propre | ✅ Commune propre | communeCode |
| COORDINATEUR_LOCAL | ✅ Commune propre | ✅ Commune propre | communeCode |
| MEAL_NATIONAL | ✅ Toutes communes | ✅ Toutes communes | Aucun filtre |
| CHARGE_PROJET | ✅ Toutes communes | ✅ Toutes communes | Aucun filtre |
| DIRECTION | ✅ Toutes communes | ✅ Toutes communes | Aucun filtre |
| ADMIN | ✅ Toutes communes | ✅ Toutes communes | Aucun filtre |
| SUPER_ADMIN | ✅ Toutes communes | ✅ Toutes communes | Aucun filtre |
Nota : PSYCHOLOGUE/ASSISTANT_SOCIAL sans
communeCoderenseigné voient toutes les données (pas de filtre possible). L'affectation d'une commune est fortement recommandée à la création du compte.
Matrice des onglets pilotage visibles par rôle¶
| Onglet (URL) | PSYCHOLOGUE / ASSISTANT_SOCIAL | MEAL_COMMUNAL | MEAL_NATIONAL / ADMIN / SUPER_ADMIN |
|---|---|---|---|
Saisie par activité (/pilotage/saisie) |
✅ | ✅ | ✅ |
Mon historique (/pilotage/mon-historique) |
✅ | ❌ | ❌ |
Saisies équipe (/pilotage/saisies-equipe) |
✅ (v3) | ✅ | ✅ |
Tableau de bord (/pilotage/stats) |
❌ | ✅ | ✅ |
Cumul mensuel (/pilotage/cumul) |
❌ | ✅ | ✅ |
Indicateurs de suivi (/pilotage/indicateurs) |
❌ | ✅ | ✅ |
Études diagnostiques (/pilotage/etudes) |
❌ | ✅ | ✅ |
Rapports (/rapports) |
❌ | ✅ | ✅ |
Bilan par profil¶
| Profil | Email de test | Connexion | Tests accordés | Tests refusés | Résultat |
|---|---|---|---|---|---|
| PSYCHOLOGUE | test.agent@projetesm.test |
✅ | 9/9 | 3/3 | ✅ 13/13 |
| ASSISTANT SOCIAL | assistant.social.test@esm.local |
✅ | 6/6 | 2/2 | ✅ 9/9 |
| MEAL COMMUNAL | test.meal.communal@projetesm.test |
✅ | 6/6 | 2/2 | ✅ 8/8 |
| MEAL NATIONAL | test.meal.national@projetesm.test |
✅ | 5/5 | 2/2 | ✅ 7/7 |
| CHARGÉ DE PROJET | test.charge.projet@projetesm.test |
✅ | 6/6 | 2/2 | ✅ 8/8 |
| BAILLEUR AFD | test.bailleur@projetesm.test |
✅ | 5/5 | 2/2 | ✅ 7/7 |
| ADMIN | test.admin@projetesm.test |
✅ | 7/7 | — | ✅ 7/7 |
| SUPER ADMIN | test.super.admin@projetesm.test |
✅ | 7/7 | — | ✅ 7/7 |
Détail par profil¶
PSYCHOLOGUE¶
Périmètre : Commune N'Dali — saisie indicateurs + consultation équipe commune
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/esm/accompagnements |
GET | ACCOMPAGNEMENT_LIRE | 200 | ✅ 200 |
/api/v1/esm/tuteurs |
GET | ACTEUR_LIRE | 200 | ✅ 200 |
/api/v1/esm/maitres-coraniques |
GET | ACTEUR_LIRE | 200 | ✅ 200 |
/api/v1/esm/parents |
GET | ACTEUR_LIRE | 200 | ✅ 200 |
/api/v1/esm/formations |
GET | FORMATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/insertion |
GET | INSERTION_LIRE | 200 | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/saisies-detail |
GET | INDICATEUR_LIRE | 200 (saisies commune) | ✅ 200 (v3) |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 403 | ✅ 403 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 403 | ✅ 403 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 403 | ✅ 403 |
Sidebar (v3) : Onglet "Saisies équipe" désormais visible et accessible (commune N'Dali).
ASSISTANT SOCIAL¶
Périmètre : Commune Kandi — saisie indicateurs + consultation équipe commune
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/esm/accompagnements |
GET | ACCOMPAGNEMENT_LIRE | 200 | ✅ 200 |
/api/v1/esm/tuteurs |
GET | ACTEUR_LIRE | 200 | ✅ 200 |
/api/v1/esm/formations |
GET | FORMATION_LIRE | 200 | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/saisies-detail |
GET | INDICATEUR_LIRE | 200 (saisies commune) | ✅ 200 (v3) |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 403 | ✅ 403 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 403 | ✅ 403 |
Sidebar (v3) : Onglet "Saisies équipe" désormais visible et accessible (commune Kandi).
MEAL COMMUNAL¶
Périmètre : Commune N'Dali — supervision et agrégats commune
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/esm/accompagnements |
GET | ACCOMPAGNEMENT_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/etudes |
GET | ETUDE_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/saisies-detail |
GET | INDICATEUR_LIRE | 200 (saisies commune) | ✅ 200 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 200 (scope commune v3) | ✅ 200 |
/api/v1/esm/rapports/kpis |
GET | INDICATEUR_LIRE | 200 (scope commune v3) | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 403 | ✅ 403 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 403 | ✅ 403 |
Scope données (v3) : Tableau de bord et KPIs scopés à la commune N'Dali : enfants filtrés par
communeCode, accompagnements parutilisateur.communeCode. Avant v3 : seulement les données personnelles du MEAL_COMMUNAL.
MEAL NATIONAL¶
Périmètre : Toutes communes — vision nationale complète
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/esm/accompagnements |
GET | ACCOMPAGNEMENT_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/saisies-detail |
GET | INDICATEUR_LIRE | 200 (toutes communes) | ✅ 200 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 200 (scope global v3) | ✅ 200 |
/api/v1/esm/rapports/kpis |
GET | INDICATEUR_LIRE | 200 (scope global v3) | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 403 | ✅ 403 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 403 | ✅ 403 |
Scope données (v3) : Aucun filtre — toutes communes, tous agents.
CHARGÉ DE PROJET¶
Périmètre : Toutes communes — lecture seule, vision nationale
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/esm/accompagnements |
GET | ACCOMPAGNEMENT_LIRE | 200 | ✅ 200 |
/api/v1/esm/formations |
GET | FORMATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/insertion |
GET | INSERTION_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 200 (scope global v3) | ✅ 200 |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 403 | ✅ 403 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 403 | ✅ 403 |
BAILLEUR AFD¶
Périmètre : Toutes communes — consultation agrégats uniquement
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/esm/accompagnements |
GET | ACCOMPAGNEMENT_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 200 | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 403 | ✅ 403 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 403 | ✅ 403 |
Scope données : BAILLEUR ne figure pas dans les rôles globaux ni communes — reçoit les données scopées par
idUtilisateur. À revoir si le BAILLEUR doit voir des agrégats nationaux sans restriction.
ADMIN¶
Périmètre : Toutes communes — accès complet
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/saisies-detail |
GET | INDICATEUR_LIRE | 200 (toutes communes) | ✅ 200 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 200 (scope global v3) | ✅ 200 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 200 | ✅ 200 |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 200 | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/referentiels/communes |
GET | REFERENTIEL_MODIFIER | 200 | ✅ 200 |
SUPER ADMIN¶
Périmètre : Toutes communes — accès total sans restriction
| Route | Méthode | Permission | Résultat attendu | Résultat obtenu |
|---|---|---|---|---|
/api/v1/esm/enfants |
GET | ENFANT_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/indicateurs |
GET | INDICATEUR_LIRE | 200 | ✅ 200 |
/api/v1/pilotage/saisies-detail |
GET | INDICATEUR_LIRE | 200 (toutes communes) | ✅ 200 |
/api/v1/esm/rapports/tableau-de-bord |
GET | RAPPORT_EXPORTER | 200 (scope global v3) | ✅ 200 |
/api/v1/esm/administration/utilisateurs |
GET | UTILISATEUR_GERER | 200 | ✅ 200 |
/api/v1/esm/audit/logs |
GET | AUDIT_LIRE | 200 | ✅ 200 |
/api/v1/mobilisation/comites |
GET | MOBILISATION_LIRE | 200 | ✅ 200 |
/api/v1/esm/referentiels/communes |
GET | REFERENTIEL_MODIFIER | 200 | ✅ 200 |
Anomalies¶
Aucune anomalie active.
Historique des corrections :
| Version | Date | Description |
|---|---|---|
| v1 | 2026-06-23 | Faux positif initial (BAILLEUR / MOBILISATION_LIRE) : erreur dans le script de test, BAILLEUR possède légitimement MOBILISATION_LIRE. |
| v2 | 2026-06-23 | Erreur grave : PSYCHOLOGUE et ASSISTANT_SOCIAL exclus de INDICATEUR_LIRE et INDICATEUR_SAISIR. Correction : ajout dans agentTerrain dans seed.ts + application en base + routeur frontend. |
| v3 | 2026-06-26 | Bug scope données : Toutes les requêtes rapports filtraient par idUtilisateur. Corrections : (1) scope global pour SUPER_ADMIN/ADMIN/MEAL_NATIONAL/CHARGE_PROJET/DIRECTION ; (2) scope commune (communeCode) pour MEAL_COMMUNAL/COORDINATEUR_LOCAL ; (3) scope personnel (idUtilisateur) pour agents terrain. |
| v3 | 2026-06-26 | Bug accès saisies-equipe : Route /pilotage/saisies-equipe protégée par ROLES_COORD_ET_ADMIN, bloquant PSYCHOLOGUE et ASSISTANT_SOCIAL. Correction : route déplacée vers ROLES_AVEC_PILOTAGE, onglet déverrouillé, lien sidebar sans restriction. |
Point de vigilance — BAILLEUR¶
Le BAILLEUR (RAPPORT_EXPORTER) a accès au tableau de bord rapports mais le scope actuel lui retourne ses données personnelles uniquement (idUtilisateur). Si le BAILLEUR doit consulter des agrégats nationaux, il faudra l'ajouter à ROLES_GLOBAL dans RapportsRepositoryPrisma.ts.
Script de test¶
Le script de test est disponible et réutilisable :
BackEnd/prisma/create-comptes-test.ts — réinitialise tous les comptes test
Script RBAC (scratchpad session) — relançable via bash test-rbac.sh
Note : Le rate limiter auth est fixé à 10 requêtes / 15 min par IP. Lancer toutes les connexions en une seule passe pour éviter le blocage.