fix(rbac) : référentiels /categories et /sites lisibles par les rôles métier (ERP-102) #53
Reference in New Issue
Block a user
Delete Branch "fix/ERP-102-rbac-referentiels-transverses"
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
ERP-102 — Découvert pendant ERP-64. Connecté avec un rôle métier (bureau / compta / commerciale),
GET /api/categoriesetGET /api/sitesrenvoient 403, alors que/tva_modes,/payment_delays,/payment_types,/banksrenvoient 200.Conséquences : page Création client inutilisable (le
Promise.allrejetait → tous les selects vides) et filtres Catégories/Sites vides au répertoire.Cause
La
securitydesGetCollection/GetdeCategoryetSiteexigeaitcatalog.categories.view/sites.view— permissions d'administration du Catalogue / des Sites. Or ces référentiels sont transverses : tout rôle qui gère un tiers doit pouvoir les lire.Correctif back — Option C (permission de lecture-référentiel dédiée)
Choix d'archi retenu parmi les 3 du ticket :
... or is_granted('commercial.clients.view')) : couplerCategory/Siteà une permission Commercial viole l'esprit de la règle ABSOLUE n°1 et ne scale pas (M2 Fournisseurs devrait rajouter un OR)..viewaux rôles métier) :.view= accès admin → items sidebar admin Catégories/Sites exposés à une commerciale.catalog.categories.read_ref/sites.read_ref, distincte de.view(pas d'item sidebar) et de.manage. Chaque permission appartient à son module → isolement inter-module préservé, réutilisable tel quel par M2 Fournisseurs. C'est la « permission référentiel lisible » que le ticket pointe lui-même.Détail :
CatalogModule/SitesModule: déclaration des deux permissionsread_ref.Category/Site: security lecture (liste + item) =view OR read_ref.RbacSeeder(matrice § 2.7) :read_refattaché à bureau / compta / commerciale ; usine reste sans accès.Durcissement front (résilience — requis dans tous les cas)
useClientReferentials.loadCommon:Promise.all→Promise.allSettledavec affectation isolée par référentiel. L'échec d'un endpoint ne vide plus que son select, plus la totalité du formulaire.Tests (TDD)
ClientRBACMatrixTest::testBusinessRolesCanReadCategoriesAndSitesReferentials— bureau/compta/commerciale listent/categorieset/sites(200), usine reste 403.SitesModuleTest— set de permissions porté à 4 codes.useClientReferentials.spec(Vitest) — un référentiel en échec ne vide que son select.Vérifications
make test(back) : 467/467 ✓make nuxt-test(front) : 131/131 ✓make php-cs-fixer: conforme ✓Note miroirs RBAC
config/sidebar.php/personas.ts/SeedE2ECommand.phpnon touchés :read_refn'ajoute aucun item sidebar, le persona E2Euser-fulllit déjà via.view, et aucun persona ne modélise un rôle métier seul. Pas de nouveau test E2E (règle n°7 : bug attrapé avant prod). La source de vérité de la matrice (RbacSeeder) est mise à jour et couverte parClientRBACMatrixTest.Closes ERP-102.
f9c881c771to54fe48993f