Skip to content

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

Draft
Korbeil wants to merge 1 commit into
afup:masterfrom
Korbeil:afup-ajouter-un-check-isgranted
Draft

Korbeil wants to merge 1 commit 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.

- { path: ^/admin/(members/reporting|association/relances|talk|slackmembers/check|healthcheck), roles: ROLE_ADMIN}
- { path: ^/member, roles: [ROLE_USER, ROLE_MEMBER_EXPIRED]}
- { path: ^/admin/, roles: ROLE_MEMBER_EXPIRED }
- { path: ^/member, roles: [ROLE_USER, ROLE_MEMBER_EXPIRED] }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thought : ça me gêne d'avoir un access_control aussi précis, il reprend exactement les mêmes rôles que les isGranted. Ça va être compliqué à maintenir je trouve.

Est-ce que l'on pourrait simplifier les règles ?

ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
# Company managers keep self-service access (bridge, data migration pending)
ROLE_COMPANY_MANAGER: [ROLE_USER, ROLE_MEMBRES_READER]
# ─── Marqueur console vide : ne donne accès à rien ───

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question : je ne comprends pas ce commentaire. C'est quoi console ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

en gros le ROLE_ADMIN donne juste accès à la console Admin, mais pas accès aux parties de l'admin, après soit tu as un role READER/WRITER, ou tu es SUPER_ADMIN et tu as accès à tout !

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