Aller au contenu

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_LIRE et INDICATEUR_SAISIR. Ces permissions ont été ajoutées au profil agentTerrain dans seed.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 par ROLES_COORD_ET_ADMIN. Corrigé : route déplacée vers ROLES_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 par idUtilisateur pour 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 par communeCode (enfants, formations, maîtres coraniques) ou par utilisateur.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 communeCode renseigné 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 par utilisateur.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.