Rapport de test fonctionnel — complément d'audit — confidentiel

Test des fonctionnalités & manuel d'utilisation par rôle

Parcours complet de l'application déployée, profil par profil : comment chaque utilisateur se connecte, ce qu'il voit, ce qu'il peut faire — et ce que les tests révèlent sur le contrôle d'accès réel. Complément au rapport d'audit statique de la plateforme DCP / DGCBF.

ClientDCP / DGCBF — République Gabonaise
PrestataireBinaire SAS — binaire.tech
NatureTest dynamique sur déploiement local (Docker)
Complément deAudit statique (rapport-web)
Couverture du test dynamique 5 PROFILS PARCOURUS
Profils testés en conditions réelles
5 / 5 actifs
Tableaux de bord distincts confirmés
4 vues
Contrôle d'accès serveur
CONTOURNÉ (R-01)
Écrans d'admin atteints par un rôle limité
6 / 6
Anomalie fonctionnelle bloquante
Écran « Programmes » (500)
Point de vigilance performance
Page 2,4 Mo

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.

Articulation des livrables. Ce rapport se lit après le rapport d'audit (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).

🔎 Preuve : code source 🗄 Preuve : base SQL 🧪 Preuve : test dynamique ⚠ À confirmer sur production

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).

Navigateur / client HTTP │ http://localhost:8088 ▼ Conteneur « app » — PHP 8.2 + Apache + Laravel 11 / Backpack 6.7 │ guard « backpack », sessions en base ▼ Conteneur « db » — MariaDB 11.8 (dump u744010311_dcp_new = 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.
Un seul écart avec la production, entièrement maîtrisé. Les mots de passe du dump étant hachés (non réversibles), un mot de passe de test commun a été réinitialisé pour permettre les connexions. Cette écriture ne concerne que la base du conteneur jetable — ni le dump d'origine ni la production ne sont modifiés. Aucune donnée n'a été supprimée ni altérée pendant les tests (accès en lecture uniquement sur les écrans sensibles).
À confirmer sur production Les tests portent sur le comportement applicatif (code identique à la sauvegarde). La configuration réseau réelle (HTTPS, en-têtes, mode debug, pare-feu) relève de l'environnement de production et n'est pas reproduite ici.

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).
http://localhost:8088/admin/login
Page de connexion de la plateforme — formulaire e-mail et mot de passe
Capture réelle. Page de connexion commune à tous les profils (« Connexion :: DGCBF Reporting »).
Note technique. L'authentification s'appuie sur le guard backpack (distinct du guard web standard). Les mots de passe sont hachés en bcrypt — point conforme confirmé par l'audit. code

04 — 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é.

Rôles réellement portés par des comptes dans la base testée SQL
Profil (rôle)Type d'entitéCompte de testEntité rattachéeÉcran d'accueil observé
Super Administrateuraucun rôle rattachésuperadmin@gmail.com—Dashboard « Administrateur du Système »
Responsable de Missionmissionr.mission.mcp@gmail.comMission MCP 2025/mission-manager/dashboard
Responsable de Programmeprogrammer.prog.dgcbf@gmail.comGestion des dépenses publiques/programme-manager/dashboard
Responsable de BOPboprbop.dgcbf@gmail.comBudget et dépenses publiques/bop-manager/dashboard
Point Focal (Direction)directionpf.dcp@gmail.comDCPDashboard « Direction » (saisie)
Constat de conception relevé au test. La logique d'aiguillage repose sur le champ 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 SQL

Par 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

PROFIL — ADMINISTRATION
Super Administrateur
Gestion complèteTesté ✓
À 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, saisir superadmin@gmail.com et le mot de passe.
  • 2Arrivée directe sur /admin/dashboard, en-tête « Tableau de bord - Administrateur du Système ».
http://localhost:8088/admin/dashboard
Tableau de bord Administrateur du Système : cartes de synthèse et guide de configuration
Capture réelle — Super Administrateur. Menu d'administration complet en haut (Tableau de bord, Gestion des Accès, Objectifs, Historiques), cartes de synthèse (Utilisateurs, Entités, Rôles, Historiques du jour) et « Guide de Configuration » en 4 étapes.
Détail relevé sur la capture. Le guide de configuration affiche en clair le mot de passe par défaut des comptes créés (reporting@2025) — ce qui illustre visuellement le constat VULN-003 (mot de passe par défaut prévisible) du rapport d'audit. test

Ce 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ÉcranOpérations disponibles
Gestion des Accès → Rôles/admin/roleLister, créer, modifier, supprimer un rôle
Gestion des Accès → Entités hiérarchiques/admin/entityLister, créer, modifier, supprimer une entité (Ministère, Mission, Programme, BOP, UO, Direction)
Gestion des Accès → Utilisateurs/admin/userLister, créer, modifier, supprimer un compte ; rattacher rôle + entité
Objectifs/admin/objectiveLister, créer, modifier, supprimer des objectifs
Historiques/admin/activity-logConsulter le journal d'audit métier
Cas particulier de ce compte. Le compte Super Admin n'a aucun rôle rattaché dans la base. C'est précisément l'absence de rôle (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 code

06 — Manuel du profil

Responsable de Mission

PROFIL — PILOTAGE
Responsable de Mission
Consultation / pilotageTesté ✓
À 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.
http://localhost:8088/admin/mission-manager/dashboard
Tableau de bord Responsable de Mission : crédits, graphiques et liste des programmes
Capture réelle — Responsable de Mission (Mission MCP 2025). Cartes crédits répartis / ordonnancés / payés / taux de consommation, tableau des programmes, graphiques de réalisation et de consommation, liste dépliable des programmes de la 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}).
Menu réduit. Ce profil ne voit que l'entrée « Tableau de bord ». Aucun écran d'administration n'apparaît dans sa navigation. test Voir toutefois la section 12 : cette limitation n'est qu'un masquage d'interface.

07 — Manuel du profil

Responsable de Programme

PROFIL — PILOTAGE
Responsable de Programme
Consultation / pilotageTesté ✓
À 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
http://localhost:8088/admin/programme-manager/dashboard
Tableau de bord Responsable de Programme : crédits et ventilation par BOP
Capture réelle — Responsable de Programme. Synthèse du programme et ventilation par BOP, avec graphiques de consommation et réalisation des activités par objectif.

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}.
Menu réduit à « Tableau de bord », comme le Responsable de Mission. test

08 — Manuel du profil

Responsable de BOP

PROFIL — PILOTAGE
Responsable de BOP
Consultation / pilotageTesté ✓
À 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
http://localhost:8088/admin/bop-manager/dashboard
Tableau de bord Responsable de BOP : crédits et détail par unité opérationnelle
Capture réelle — Responsable de BOP. Synthèse du BOP et détail par Unité Opérationnelle (activités par objectif pour chaque UO).

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}.
Menu réduit à « Tableau de bord ». test

09 — Manuel du profil

Point Focal (Direction)

PROFIL — SAISIE OPÉRATIONNELLE
Point Focal — Direction
Saisie / contributionTesté ✓
À 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.

http://localhost:8088/admin/dashboard (direction : DCP)
Tableau de bord Point Focal Direction : onglets trimestriels et saisie des activités
Capture réelle — Point Focal (Direction DCP). Écran de suivi et de saisie : onglets Suivi global / Crédits / Synthèse / Trimestres, avec édition en ligne des activités et sous-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}).
Observation de test — poids de la page. Le tableau de bord de cette direction pèse ~2,4 Mo de HTML (contre ~40–100 Ko pour les autres), signe que beaucoup de données et de logique sont rendues d'un bloc côté serveur. À volume croissant, ce point deviendra sensible (temps de chargement). test

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ôles présents dans la table roles sans compte associé SQL
RôleVue dédiée présenteStatut au test
Ministredashboard-ministerNon attribué
Admin du ministère / Administrateur du Ministèredashboard-ministry-adminNon attribué
Directeur / Directeur Général (DG)dashboard-director, dashboard-director-adminNon attribué
Responsable d'UOvia l'écran BOP/UONon attribué
Manager du système—Non attribué
Lecture d'audit. La coexistence de rôles actifs, de rôles définis mais non utilisés, de plusieurs vues « dashboard » (dont des variantes -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. code

11 — 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

ÉcranURLListerCréerModifierSupprimer
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é.

Résultat. Chaque profil métier (Mission, Programme, BOP, Point Focal) ne voit dans son menu que « Tableau de bord ». Pourtant, en saisissant directement l'URL d'un écran d'administration, chacun y accède avec succès (HTTP 200) — gestion des utilisateurs, des rôles, des entités, des ministères, des directions et du journal d'audit compris. Le menu réduit n'est qu'un masquage d'interface, pas une protection.
Accès direct par l'URL aux écrans d'administration, par profil — codes HTTP relevés au test test
Écran (réservé admin)Super AdminR. MissionR. ProgrammeR. BOPPoint Focal
/admin/user (utilisateurs)200200 ⚠200 ⚠200 ⚠200 ⚠
/admin/role (rôles)200200 ⚠200 ⚠200 ⚠200 ⚠
/admin/entity (entités)200200 ⚠200 ⚠200 ⚠200 ⚠
/admin/ministry (ministères)200200 ⚠200 ⚠200 ⚠200 ⚠
/admin/direction (directions)200200 ⚠200 ⚠200 ⚠200 ⚠
/admin/activity-log (journal)200200 ⚠200 ⚠200 ⚠200 ⚠
Compte à rôle limité→ saisie directe de l'URL admin→ aucune vérification de rôle serveur→ écran d'administration servi (200)
http://localhost:8088/admin/user — connecté en « Responsable de BOP »
Liste complète des utilisateurs affichée alors que l'utilisateur connecté est un simple Responsable de BOP
Preuve visuelle de R-01. Session ouverte avec le compte 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. test

Ce 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.

Portée réelle. Le test s'est limité à l'accès en lecture (affichage des écrans), sans exécuter d'action destructrice. Mais les routes d'écriture (création/modification/suppression d'utilisateurs, de rôles, de crédits) partagent exactement le même contrôle d'admission défaillant : rien, côté serveur, ne les réserve à un administrateur. L'ampleur exacte en écriture n'a volontairement pas été testée pour ne rien altérer.
Recommandation (rappel de l'audit, priorité P0). Mettre en place un contrôle d'accès serveur réel — Policies Laravel par ressource, correction du middleware, tests de non-régression — indépendamment de tout projet de refonte. Cette faille concerne la plateforme en service aujourd'hui.

13 — Ce qui casse ou dérive

Anomalies fonctionnelles observées

ANOMALIE T-01
Écran « Programmes / Plans d'action » en erreur
BloquantP1
Constat
L'écran /admin/action-plan renvoie 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 given dans datatables_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 CreditController hors du namespace Admin, 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).

Contexte atténuant. Le volume actuel reste celui d'un pilote ; ces points ne deviendront réellement sensibles qu'avec la montée en charge des exercices budgétaires — mais ils sont structurels et méritent d'être traités à la conception de la cible.

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 de test → correction apportée par la cible
Constat observé au testCorrection structurelle dans la ciblePrincipe
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
Nuance importante, reprise de l'audit. La cible n'est pas « automatiquement meilleure ». La faille de contrôle d'accès (section 12) est corrigeable dès aujourd'hui sur l'existant (Policies Laravel) à un coût sans commune mesure avec une réécriture. La bonne lecture est : (1) sécuriser l'existant sans attendre, puis (2) décider de la refonte sur des bases saines. La refonte apporte une correction structurelle et durable ; elle ne dispense pas de la correction immédiate.

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.

Message clé. Deux temps, dans cet ordre : (1) corriger sans délai le contrôle d'accès et l'écran en erreur sur l'existant ; (2) engager, sur cette base assainie, la décision de refonte vers l'architecture cible — qui transforme ces correctifs ponctuels en garanties structurelles et durables.

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.