fix(rbac) : appliquer les permissions granulaires sur les ressources métier #19
Reference in New Issue
Block a user
Delete Branch "feat/rbac-enforcement"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Un utilisateur sans permission RBAC voyait quand même projets, tâches, clients, temps, etc. Le RBAC granulaire n’était pas réellement appliqué sur les ressources métier.
Corrections RBAC
project-management.*ettime-tracking.*n’étaient évaluées par aucun voter (refus pour tous, admin compris). Ajout du tiret.*.view(lecture) /*.manage(écriture) sur les 17 ressources métier (ProjectManagement, Directory, TimeTracking). Métadonnées tâches lisibles viaprojects.view OR tasks.view; Directory partagé client/prospect viaclients.* OR prospects.*; TimeEntry conserve le self-service.ProjectAccessControlTest(0 perm → 403, view → 200, view ne donne pas l’écriture → 403).Refacto Directory
⚠️ Déploiement
Le rôle système
userest volontairement vide : après déploiement, les non-admins ne verront plus rien tant que des permissions ne leur sont pas attribuées. Penser àapp:seed-rbac+app:sync-permissions.Vérification
176 tests verts (pre-commit), php-cs-fixer OK. Reproduit et validé en local avec un user de test sans permission.
Les ressources métier (ProjectManagement, Directory, TimeTracking) étaient gardées par is_granted('ROLE_USER')/'ROLE_ADMIN', ignorant les permissions RBAC granulaires déclarées par les modules : un utilisateur sans permission voyait quand même projets, tâches, clients, etc. - PermissionVoter : le regex excluait les tirets, donc project-management.* et time-tracking.* n'étaient supportées par aucun voter (refus pour tous, admin compris car le bypass ROLE_ADMIN est interne au voter). Ajout du tiret. - Câblage des permissions *.view (lecture) / *.manage (écriture) sur les 17 ressources métier. Métadonnées tâches lisibles via projects.view OR tasks.view. Directory partagé client/prospect via clients.* OR prospects.*. TimeEntry conserve le self-service (object.getUser() == user). - Sidebar : gating par permission effective des onglets Projets / Mes tâches / Suivi du temps (config/sidebar.php). - Test fonctionnel ProjectAccessControlTest (0 perm -> 403, view -> 200, view ne donne pas l'écriture -> 403).Les formulaires d'ajout/édition client et prospect ne conservent que le champ « Nom société ». Les coordonnées (email, téléphone) et les champs prospect (société, statut, source, notes) sont retirés : ils seront gérés via Contact. Le statut prospect prend son défaut New à la création ; DTO assouplis, payload réduit à { name }.