Skip to content

Sécurise le back-office admin : matrice READ/WRITE par module et IsGranted - #2429

Open
Korbeil wants to merge 4 commits into
afup:masterfrom
Korbeil:afup-ajouter-un-check-isgranted
Open

Korbeil wants to merge 4 commits into
afup:masterfrom
Korbeil:afup-ajouter-un-check-isgranted

Conversation

@Korbeil

@Korbeil Korbeil commented Oct 10, 2026 •

Copy link
Copy Markdown
Member

Description

Refonte complète du contrôle d'accès au back-office /admin suivant l'audit de sécurité : chaque module dispose désormais d'un couple de rôles *READER/*WRITER, ROLE_ADMIN devient un simple marqueur d'accès à la console et ROLE_SUPER_ADMIN n'est plus attribué automatiquement. Toutes les routes admin sont maintenant fermées explicitement (deux barrières), avec un filet default-deny. Changement cassant : les comptes avec LEVEL_ADMIN ne récupèrent que ROLE_ADMIN (l'impersonation nécessite désormais ROLE_SUPER_ADMIN attribué explicitement).

Changes

  • Ajout d'un attribut #[IsGranted] sur tous les controllers admin (lecture sur les listes/exports, écriture sur les add/edit/delete), avec matrice testée par un data provider PHPUnit sur chaque route.
  • Réécriture de access_control : règles explicites par module (READ sur les consultations, WRITE sur les mutations), page « Divers » réservée à ROLE_SUPER_ADMIN, default-deny sur le reste de /admin.
  • Nouvelle hiérarchie de rôles : WRITE ⇒ READ ⇒ ROLE_ADMIN (marqueur console vide), ROLE_SUPER_ADMIN = tous les READ + impersonation ; rôles legacy (ROLE_VEILLE, ROLE_SITE, ROLE_FORUM, ROLE_APERO, ROLE_ANTENNE, ROLE_ANNUAIRE) forcés en pont vers les nouveaux rôles.
  • Menu back-office et compte utilisateur alignés sur ces rôles (visibilité par rôle READ minimal de chaque catégorie).

How to test

  1. Connecter un adhérent à cotisation expirée : il ne doit plus accéder à aucune page /admin (403 sur /admin/logs, /admin/speaker, …).
  2. Avec un compte ROLE_SUPER_ADMIN : vérifier l'accès complet (listes en lecture + actions d'écriture) et les pages Divers ; avec un compte limité à un rôle module (ex. ROLE_VEILLE_READER) : console visible mais uniquement les pages de son module.
  3. Lancer vendor/bin/phpunit tests/integration/AppBundle/Security/AdminAccessControlTest.php : chaque route /admin doit passer la matrice d'accès au furet des rôles.

Interface « Paramètres » des personnes physiques (refonte)

Les formulaires personnes physiques (ajout / modification) reflètent la matrice READ/WRITE par module :

  • Une case « Accès à l'admin » attribue le marqueur de console ROLE_ADMIN (décochée par défaut)
  • Un select « -- / Lecture seule / Gestionnaire » par catégorie du menu admin (Membres, Veille, Site, Super-apéro, Évènements, Trésorerie, Assemblée générale, Planète, Antennes) pilote directement les rôles ROLE_*_READER / ROLE_*_WRITER
  • niveau_modules passe de 5 à 9 caractères (0 = --, 1 = Lecture seule, 2 = Gestionnaire), les niveaux existants sont conservés par migration
  • Le bouton « Administration » s'affiche dès qu'un ROLE_ADMIN ou un rôle fonctionnel (READ ⩾) est porté, y compris en lecture seule
  • La page « Administrateurs du site » affiche le niveau par module
  • Suppression de la donnée morte des anciens selects, tests unitaires sur l'association niveaux → rôles

Pour tester : Admin → Personnes physiques → Ajouter, vérifier la case et les 9 selects ; enregistrer un utilisateur « Lecture seule » sur un module (accès console sans modification) ; vérifier les colonnes par module dans « Administrateurs du site ».

Screenshot

image

Comment thread config/packages/security.yaml Resolved
Comment thread config/packages/security.yaml Resolved
@Korbeil
Korbeil force-pushed the afup-ajouter-un-check-isgranted branch from a9c5ba0 to 49df2cf Compare October 12, 2026 14:35
@Korbeil
Korbeil marked this pull request as ready for review October 12, 2026 15:00
@Korbeil
Korbeil force-pushed the afup-ajouter-un-check-isgranted branch from 49df2cf to ee8c035 Compare October 12, 2026 15:16
@Korbeil
Korbeil requested a review from stakovicz October 12, 2026 15:21
…s accès admin

- les droits du back-office sont portés par les rôles ROLE_<MODULE>_READER/_WRITER :
  les colonnes niveau et niveau_modules sont supprimées (migration de conversion)
- formulaire : matrice Aucun / Lecteur / Gestionnaire par module et cases à cocher
  pour les rôles hors matrice (super administrateur, gestionnaire de personne morale)
- liste des administrateurs et menu recalés sur les nouveaux rôles
@Korbeil
Korbeil force-pushed the afup-ajouter-un-check-isgranted branch from 3d91038 to a32b928 Compare October 27, 2026 13:22
Comment thread config/packages/backoffice_menu.yaml Resolved
…au super admin, menu Salles

- La migration ne convertit plus niveau / niveau_modules : seuls ROLE_MEMBER_* et ROLE_COMPANY_MANAGER sont conservés, la personne physique 3225 devient l'unique super admin (migration ignorée si elle n'existe pas).
- Seul un super admin peut modifier le mot de passe d'une personne physique.
- Le menu Salles requiert ROLE_EVENT_WRITER, comme son contrôleur.
@Korbeil
Korbeil requested a review from stakovicz October 27, 2026 16:55
@Korbeil

Korbeil commented Oct 27, 2026

Copy link
Copy Markdown
Member Author

merci pour la review @stakovicz
j'ai changé la migration surtout, c'est le gros bout important ici https://github.com/afup/web/pull/2429/changes#diff-646d233a8a9da5af94fa3700abb57f90012bc5cfd9ca5e882622afd0110ab9d9R15

ça wype tous les accès comme on s'était dis et ça file les droits à Nathan puis on réassignera depuis le BO
ça ne se lance que si son user existe (pour éviter les soucis en local)

@Korbeil
Korbeil marked this pull request as draft October 27, 2026 17:25
@Korbeil
Korbeil marked this pull request as ready for review October 28, 2026 09:30
@Korbeil
Korbeil marked this pull request as draft October 29, 2026 14:20
… super admin, droits effectifs des administrateurs, règle PHPStan ROLE_ADMIN
@Korbeil
Korbeil marked this pull request as ready for review October 30, 2026 13:55
@Korbeil
Korbeil requested a review from stakovicz October 30, 2026 16:11
@stakovicz

Copy link
Copy Markdown
Contributor

Bravo pour cette PR !
Pas évident, car ça touche la sécurité, j'espère qu'on n'a rien oublié.

Prêt pour le bigbang !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants