01 — Pourquoi ce document
Objet & complémentarité avec l'audit précédent
Le premier rapport (audit statique) a diagnostiqué la plateforme par lecture du code source et des sauvegardes SQL, sans exécution. Le présent document vient le compléter par un test dynamique : l'application a été déployée à l'identique et réellement parcourue, profil par profil. Il poursuit deux objectifs distincts :
① Un manuel d'utilisation par rôle
Décrire, de façon assez détaillée pour être suivie par une personne non technique, comment chaque profil se connecte, sur quel écran il arrive, et ce qu'il peut faire — tel que l'application se comporte réellement aujourd'hui.
② Une confirmation dynamique des risques
Vérifier en conditions réelles les constats de l'audit statique — en particulier le contrôle d'accès (R-01 / VULN-001) — puis relier chaque limite observée à l'optimisation permise par l'architecture cible.
audit/rapport-web). Il ne réénonce pas les preuves de code déjà
établies : il les confirme par le test et renvoie aux références existantes
(VULN-001 à 003, R-01 à R-15).
02 — Comment les tests ont été menés
Environnement & méthode de test
L'application a été déployée en local via Docker, à partir de la
sauvegarde transmise, sans modification du code : un conteneur applicatif
(PHP 8.2 / Apache) et un conteneur base de données
(MariaDB 11.8) chargé avec le dump de production
u744010311_dcp_new.sql (29 tables, données réelles).
Protocole appliqué à chaque profil
- 1Connexion réelle avec le compte du profil, via le formulaire
/admin/login(jeton CSRF + cookie de session). - 2Relevé de l'écran d'accueil obtenu après connexion (URL finale après redirection, titre, contenu).
- 3Relevé du menu réellement affiché (liens de navigation présents dans la barre latérale).
- 4Test du contrôle d'accès : tentative d'accès direct, par l'URL, aux écrans d'administration théoriquement réservés (utilisateurs, rôles, entités, etc.).
- 5Captures d'écran authentiques : chaque écran présenté dans ce rapport est une capture réelle de l'application, prise par un navigateur piloté (Chromium/Playwright) après connexion effective au compte concerné — ce ne sont pas des maquettes.
03 — Le point d'entrée commun
Se connecter à la plateforme
La connexion est identique pour tous les profils. La différence de périmètre ne se joue qu'après l'authentification, en fonction du rôle rattaché au compte.
- 1Ouvrir l'adresse de la plateforme. La racine (
/) redirige automatiquement vers la page de connexion/admin/login. test - 2Saisir l'adresse e-mail et le mot de passe du compte, puis valider. L'e-mail sert d'identifiant.
- 3Arrivée sur un tableau de bord qui dépend du rôle : la plateforme oriente automatiquement vers la vue correspondant au profil (voir le manuel par profil ci-dessous).
backpack (distinct du guard web standard). Les mots de passe sont
hachés en bcrypt — point conforme confirmé par l'audit. code04 — Qui est qui dans le système
Rôles & comptes de test
Un utilisateur est relié à un rôle et à une entité de la hiérarchie budgétaire (Ministère → Mission → Programme → BOP → UO, ou Direction). C'est ce couple rôle + entité qui détermine le tableau de bord affiché.
| Profil (rôle) | Type d'entité | Compte de test | Entité rattachée | Écran d'accueil observé |
|---|---|---|---|---|
| Super Administrateur | aucun rôle rattaché | superadmin@gmail.com | — | Dashboard « Administrateur du Système » |
| Responsable de Mission | mission | r.mission.mcp@gmail.com | Mission MCP 2025 | /mission-manager/dashboard |
| Responsable de Programme | programme | r.prog.dgcbf@gmail.com | Gestion des dépenses publiques | /programme-manager/dashboard |
| Responsable de BOP | bop | rbop.dgcbf@gmail.com | Budget et dépenses publiques | /bop-manager/dashboard |
| Point Focal (Direction) | direction | pf.dcp@gmail.com | DCP | Dashboard « Direction » (saisie) |
description du rôle (valeurs : mission,
programme, bop, direction…), pas sur les
méthodes prévues à cet effet (UserHelper::isManager(),
isDirector()…). Ces méthodes comparent le nom du rôle à des valeurs anglaises
('manager', 'director') qui n'existent pas dans les données
réelles (les rôles sont nommés en français : « Responsable de BOP », « Point - Focal »…).
Elles renvoient donc toujours « faux » et sont, en pratique, du code mort — cohérent avec le
constat de dette technique de l'audit. code SQLPar ailleurs, la table des rôles définit d'autres profils (Ministre, Admin du ministère, Directeur, Directeur Général, Responsable d'UO…) qui possèdent leur propre logique et parfois leur propre tableau de bord, mais ne sont rattachés à aucun compte dans la base actuelle. Ils sont décrits en section 10.
05 — Manuel du profil
Super Administrateur
- À quoi il sert
- Administrer la plateforme : comptes utilisateurs, rôles, entités de la hiérarchie, objectifs, et consultation du journal d'audit. C'est le profil de paramétrage du système.
- Compte de test
superadmin@gmail.com- Écran d'accueil
- Tableau de bord « Administrateur du Système » — vue de pilotage globale (nombres d'utilisateurs, d'entités, de rôles, comptes sans rôle, journaux du jour) suivie d'un « Guide de Configuration » en 4 étapes. test
Comment il se connecte
- 1Aller sur
/admin/login, saisirsuperadmin@gmail.comet le mot de passe. - 2Arrivée directe sur
/admin/dashboard, en-tête « Tableau de bord - Administrateur du Système ».
reporting@2025) — ce qui
illustre visuellement le constat VULN-003 (mot de passe par défaut prévisible) du
rapport d'audit. testCe qu'il peut faire (menu réellement affiché)
Le Super Administrateur est le seul profil pour lequel le menu d'administration complet s'affiche. Menu relevé au test : test
| Entrée de menu | Écran | Opérations disponibles |
|---|---|---|
| Gestion des Accès → Rôles | /admin/role | Lister, créer, modifier, supprimer un rôle |
| Gestion des Accès → Entités hiérarchiques | /admin/entity | Lister, créer, modifier, supprimer une entité (Ministère, Mission, Programme, BOP, UO, Direction) |
| Gestion des Accès → Utilisateurs | /admin/user | Lister, créer, modifier, supprimer un compte ; rattacher rôle + entité |
| Objectifs | /admin/objective | Lister, créer, modifier, supprimer des objectifs |
| Historiques | /admin/activity-log | Consulter le journal d'audit métier |
role == null) qui déclenche l'affichage du menu d'administration complet.
Un vrai « rôle super-admin » existe pourtant dans la table des rôles mais n'est pas
exploité — autre trace de la logique de rôles inachevée. SQL code06 — Manuel du profil
Responsable de Mission
- À quoi il sert
- Suivre la performance d'une mission et de ses programmes : consommation des crédits, réalisation des activités par objectif, ventilation par BOP.
- Compte de test
r.mission.mcp@gmail.com— rattaché à « Mission MCP 2025 »- Écran d'accueil
- Redirection automatique vers
/admin/mission-manager/dashboard. test
Comment il se connecte
- 1Connexion avec
r.mission.mcp@gmail.com. - 2La plateforme détecte le type d'entité « mission » et redirige vers le tableau de bord de mission.
Ce qu'il voit et fait
- Synthèse financière de la mission (valeurs réelles relevées au test) : crédits, ordonnancements, paiements, taux de consommation. test
- Consommation des crédits par titre et graphiques par BOP du programme.
- Réalisation des activités par objectif pour la mission.
- Navigation en profondeur vers le détail d'un programme de la mission (
/mission-manager/mission/{id}/programme/{id}).
07 — Manuel du profil
Responsable de Programme
- À quoi il sert
- Suivre un programme et la répartition de ses crédits entre ses BOP, avec le détail de réalisation par objectif.
- Compte de test
r.prog.dgcbf@gmail.com— rattaché à « Gestion des dépenses publiques »- Écran d'accueil
- Redirection vers
/admin/programme-manager/dashboard. test
Ce qu'il voit et fait
- Vue consolidée du programme et de ses crédits. test
- Ventilation par BOP avec graphiques de consommation (relevés au test : BOP 2, BOP 4, BOP 10…).
- Réalisation des activités par objectif du programme.
- Détail d'un BOP via
/programme-manager/programme/{id}/bop/{id}.
08 — Manuel du profil
Responsable de BOP
- À quoi il sert
- Suivre un Budget Opérationnel de Programme et ses Unités Opérationnelles (UO) : crédits, activités et réalisation au niveau le plus fin.
- Compte de test
rbop.dgcbf@gmail.com— rattaché à « Budget et dépenses publiques »- Écran d'accueil
- Redirection vers
/admin/bop-manager/dashboard. test
Ce qu'il voit et fait
- Synthèse du BOP et de ses crédits. test
- Détail par Unité Opérationnelle — « Activités par objectif pour UO » relevé au test.
- Consultation d'une UO via
/bop/{bop}/uo/{uo}.
09 — Manuel du profil
Point Focal (Direction)
- À quoi il sert
- C'est le profil de terrain : il renseigne, pour sa direction, les activités et sous-activités et leur suivi trimestriel (cibles, réalisations, coûts, paiements).
- Compte de test
pf.dcp@gmail.com— rattaché à la direction « DCP » (autres :pf.dsreb@gmail.com,pf.dsi@gmail.com)- Écran d'accueil
- Tableau de bord de la direction, sur
/admin/dashboard(rendu spécifique au type « direction »). test
Ce qu'il voit et fait
C'est l'écran le plus riche fonctionnellement : il agrège les statistiques trimestrielles de la direction (cibles/réalisations par objectif et par trimestre) et propose l'édition en ligne des activités.
Actions disponibles depuis cet écran (routes confirmées) :
- Ajouter une activité / sous-activité (
activity/store,sub-activity/store). - Modifier en ligne une cellule (
activity/inline-edit) — cible, réalisation, coût, paiement par trimestre. - Valider une activité (
activity/validate/{id}). - Supprimer une activité / sous-activité (
activity/{id},sub-activity/{id}).
10 — Prévus dans le système, pas activés
Rôles définis mais non attribués
La table des rôles décrit plusieurs profils supplémentaires, avec pour certains un tableau de bord dédié déjà développé, mais aucun compte ne leur est rattaché dans la base testée. Ils n'ont donc pas pu être parcourus en conditions réelles ; ils sont listés ici pour l'exhaustivité du manuel.
| Rôle | Vue dédiée présente | Statut au test |
|---|---|---|
| Ministre | dashboard-minister | Non attribué |
| Admin du ministère / Administrateur du Ministère | dashboard-ministry-admin | Non attribué |
| Directeur / Directeur Général (DG) | dashboard-director, dashboard-director-admin | Non attribué |
| Responsable d'UO | via l'écran BOP/UO | Non attribué |
| Manager du système | — | Non attribué |
-old,
-ok, -test) confirme le constat de modèle de rôles inachevé
et de code/vues « Old » laissés en place du rapport d'audit. code11 — Vue d'ensemble
Cartographie des écrans & opérations
Écrans de type CRUD (générés par Backpack) et opérations autorisées, telles que configurées dans le code. code
| Écran | URL | Lister | Créer | Modifier | Supprimer |
|---|---|---|---|---|---|
| Utilisateurs | /admin/user | ✔ | ✔ | ✔ | ✔ |
| Rôles | /admin/role | ✔ | ✔ | ✔ | ✔ |
| Entités hiérarchiques | /admin/entity | ✔ | ✔ | ✔ | ✔ |
| Objectifs | /admin/objective | ✔ | ✔ | ✔ | ✔ |
| Ministères | /admin/ministry | ✔ | ✔ | ✔ | ✔ |
| Missions | /admin/mission | ✔ | ✔ | ✔ | ✔ |
| Directions | /admin/direction | ✔ | refusé | refusé | refusé |
| Journal d'audit | /admin/activity-log | ✔ | — | — | — |
| Plans d'action (Programmes) | /admin/action-plan | Écran en erreur 500 — voir section 13 | |||
À cela s'ajoutent les tableaux de bord métier (mission, programme, BOP, direction) et les routes d'action (saisie d'activités, enregistrement de crédits, BOP/UO) décrites dans le manuel par profil.
12 — Le constat central du test
Contrôle d'accès : démonstration dynamique
L'audit statique avait établi, par lecture du code, que le contrôle d'accès n'était pas appliqué côté serveur (VULN-001 / R-01, gravité Critique). Le test dynamique le confirme sans ambiguïté.
| Écran (réservé admin) | Super Admin | R. Mission | R. Programme | R. BOP | Point Focal |
|---|---|---|---|---|---|
/admin/user (utilisateurs) | 200 | 200 ⚠ | 200 ⚠ | 200 ⚠ | 200 ⚠ |
/admin/role (rôles) | 200 | 200 ⚠ | 200 ⚠ | 200 ⚠ | 200 ⚠ |
/admin/entity (entités) | 200 | 200 ⚠ | 200 ⚠ | 200 ⚠ | 200 ⚠ |
/admin/ministry (ministères) | 200 | 200 ⚠ | 200 ⚠ | 200 ⚠ | 200 ⚠ |
/admin/direction (directions) | 200 | 200 ⚠ | 200 ⚠ | 200 ⚠ | 200 ⚠ |
/admin/activity-log (journal) | 200 | 200 ⚠ | 200 ⚠ | 200 ⚠ | 200 ⚠ |
rbop.dgcbf@gmail.com (mention « RBOP DGCBF / Administration » en haut à droite). Bien que ce profil ne dispose que du menu « Tableau de bord », l'écran de gestion des utilisateurs s'affiche intégralement — les 7 comptes, leurs rôles et entités — avec les boutons Aperçu / Modifier / Supprimer et « + Ajouter utilisateur ». Aucune restriction serveur n'est appliquée. testCe comportement s'explique par la cause déjà identifiée en audit : le contrôle
d'admission (CheckIfAdmin::checkIfUserIsAdmin()) renvoie systématiquement
true, et aucune Policy Laravel ne protège les écrans.
code Le test ne fait que le rendre visible en
conditions réelles.
13 — Ce qui casse ou dérive
Anomalies fonctionnelles observées
- Constat
- L'écran
/admin/action-planrenvoie une erreur 500 pour tous les profils testés — il est donc inutilisable en l'état. test - Cause technique
- Erreur de rendu Backpack :
htmlspecialchars() … Illuminate\Routing\UrlGenerator givendansdatatables_logic.blade.php— une valeur d'URL est passée là où une chaîne est attendue (configuration de colonne/bouton du CRUD). code - Impact
- Le pilotage des plans d'action / programmes par cet écran est impossible. À noter : certains parcours métier référencent ce module — l'anomalie doit être corrigée avant tout usage réel.
- Recommandation
- Corriger la définition de la colonne/bouton fautive du
ActionPlanCrudController; ajouter un test couvrant le simple affichage de la liste.
Autres observations confirmant l'audit
- Modèle de rôles inachevé — méthodes de détection de rôle inopérantes (noms anglais vs données françaises), rôles définis non attribués, aiguillage reposant sur un champ texte : cohérent avec R-08 (3 modèles de rattachement) et la dette technique. code SQL
- Vues « Old » / variantes multiples de tableau de bord présentes dans le code (
dashboard-old,-ok,-test) — confusion sur ce qui est réellement actif (R-13). code - Rangement hétérogène — un
CreditControllerhors du namespaceAdmin, logique de crédits répartie entre plusieurs contrôleurs (cohérent avec R-10, logique dupliquée). code
14 — Points de vigilance, pas des mesures de charge
Performance observée au test
Le test n'est pas un banc de performance : il s'agit d'observations ponctuelles sur un environnement local à faible volume. Elles illustrent les risques de performance identifiés en audit (agrégations sur table non indexée, absence de cache, traitement synchrone).
Page de saisie très lourde
Le tableau de bord d'une direction produit ~2,4 Mo de HTML en une seule réponse (données + logique rendues d'un bloc). À volume croissant, temps de chargement et charge serveur augmenteront proportionnellement. test
Rendu 100 % serveur
Chaque interaction recharge des pages entières calculées côté serveur, sans cache applicatif ni rendu client réactif — d'où l'intérêt d'un front découplé dans la cible (section 15).
15 — Du constat de test à la cible
Optimisation du fonctionnement par la refonte
Cette section relie chaque limite observée pendant les tests à la manière dont l'architecture cible proposée dans l'audit (React / Express / MongoDB, principes Zero Trust) permettrait de la corriger structurellement. Elle n'ajoute pas de nouvelle recommandation d'architecture : elle en démontre la pertinence à partir des faits de test.
| Constat observé au test | Correction structurelle dans la cible | Principe |
|---|---|---|
| Tout rôle limité atteint les écrans d'admin (section 12) | Contrôle d'accès par rôle/permission appliqué sur chaque route de l'API, côté serveur — jamais seulement dans l'interface. Une requête non autorisée est rejetée (403), quel que soit le chemin utilisé. | Zero Trust — moindre privilège |
| Menu ≠ droits réels (masquage ≠ protection) | L'interface (React) ne fait que refléter des permissions dont la source de vérité est l'API : masquer un bouton et interdire l'action deviennent une seule et même décision serveur. | Séparation front / back |
| Modèle de rôles inachevé, 3 rattachements concurrents (section 4 & 13) | Un modèle unique : chaque utilisateur porte un tableau assignments: [{entityId, role, scope}] — une seule source de vérité pour le rôle et le périmètre, remplaçant les trois tables pivot. |
Modèle documentaire unifié |
Aiguillage fragile via un champ texte (description) |
Rôles et permissions explicites et typés (RBAC/ABAC), contrôlés par schéma ; fin des comparaisons de chaînes fragiles et du code mort de détection de rôle. | Validation par schéma |
| Écran « Programmes » en erreur 500 (section 13) | Une API testable (endpoints stateless) + une suite de tests automatisés rendent ce type de régression détectable avant mise en ligne — là où l'existant n'a aucun test. | Testabilité par construction |
| Page de 2,4 Mo, rendu 100 % serveur (section 14) | Front React réactif consommant des données JSON : chargement incrémental, mises à jour sans rechargement de page, calculs lourds isolés dans une API mise à l'échelle indépendamment. | Tiers découplés & scalables |
| Journal d'audit limité aux activités | Journalisation centralisée et immuable étendue à toutes les actions sensibles (comptes, rôles, crédits) — en capitalisant sur l'existant activity_logs. |
Traçabilité Zero Trust |
Ce que la cible doit conserver de l'existant
- Le modèle métier (hiérarchie Ministère→…→Activité, suivi trimestriel des crédits par BOP/UO) — validé fidèle au test.
- La liste des rôles fonctionnels comme base d'un futur RBAC/ABAC propre.
- Les données existantes (à migrer via un plan dédié) et le journal d'audit comme socle de traçabilité.
- La logique des tableaux de bord par profil, déjà pensée par niveau (mission, programme, BOP, direction) — à réimplémenter en front réactif.
16 — En un regard
Conclusion
Le test dynamique confirme que la plateforme est fonctionnelle et fidèle au métier : chaque profil dispose d'un parcours cohérent — administration pour le Super Admin, pilotage par niveau pour les responsables de Mission, Programme et BOP, saisie opérationnelle pour le Point Focal. Le manuel par rôle ci-dessus documente ces parcours de bout en bout.
Il confirme aussi, en conditions réelles, le risque majeur de l'audit : le contrôle d'accès n'est pas appliqué côté serveur — un compte à périmètre restreint atteint l'ensemble des écrans d'administration. À cela s'ajoutent un écran « Programmes » en erreur et des signes de dette technique (modèle de rôles inachevé, vues « Old », page très lourde) déjà relevés par l'audit.
Ce rapport de test complète l'audit statique sans le remplacer. Les tests ont été menés sur un déploiement local à partir de la sauvegarde, sans modification du projet ni exploitation destructrice ; la configuration réseau de production reste à vérifier séparément.