fix(rbac) : referentiels /categories et /sites lisibles par les roles metier (ERP-102)
Les roles metier (bureau / compta / commerciale) prenaient un 403 sur GET /api/categories et GET /api/sites : la security des GetCollection/Get exigeait catalog.categories.view / sites.view, permissions reservees a l'administration du Catalogue et des Sites. Or ces referentiels sont transverses (selects de creation/filtre client) : creation de client cassee et filtres vides pour ces roles. Correctif back (Option C — permission de lecture-referentiel dediee) : - Nouvelles permissions catalog.categories.read_ref et sites.read_ref, distinctes de .view (pas d'item sidebar admin) et de .manage. Chaque permission appartient a son propre module -> aucun couplage inter-module (regle ABSOLUE n°1) et reutilisable tel quel par M2 Fournisseurs. - Security lecture (liste + item) elargie : view OR read_ref sur Category et Site. - Matrice RBAC § 2.7 (RbacSeeder) : read_ref attache a bureau / compta / commerciale. Usine reste sans acces. Durcissement front (resilience, requis dans tous les cas) : - useClientReferentials.loadCommon passe de Promise.all a Promise.allSettled avec affectation isolee par referentiel : l'echec d'un endpoint ne vide que SON select, plus la totalite du formulaire. Tests : - ClientRBACMatrixTest : les roles metier listent /categories et /sites (200), usine reste a 403. - SitesModuleTest : set de permissions porte a 4 codes. - useClientReferentials.spec : resilience d'un referentiel en echec. Miroirs E2E (personas.ts / SeedE2ECommand) non touches : read_ref n'ajoute aucun lien sidebar, le persona user-full lit deja via .view, et aucun persona ne modelise un role metier seul ; pas de nouveau test E2E (regle n°7).
This commit is contained in:
@@ -40,13 +40,18 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
*/
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
// Lecture (liste + item) : permission d'administration `sites.view` OU
|
||||
// permission de lecture-referentiel transverse `sites.read_ref` (ERP-102).
|
||||
// Le referentiel sites alimente les selects d'adresse des modules Tiers :
|
||||
// tout role qui gere des tiers doit pouvoir le lire sans porter l'acces
|
||||
// admin des Sites.
|
||||
new GetCollection(
|
||||
normalizationContext: ['groups' => ['site:read']],
|
||||
security: "is_granted('sites.view')",
|
||||
security: "is_granted('sites.view') or is_granted('sites.read_ref')",
|
||||
),
|
||||
new Get(
|
||||
normalizationContext: ['groups' => ['site:read']],
|
||||
security: "is_granted('sites.view')",
|
||||
security: "is_granted('sites.view') or is_granted('sites.read_ref')",
|
||||
),
|
||||
new Post(
|
||||
normalizationContext: ['groups' => ['site:read']],
|
||||
|
||||
Reference in New Issue
Block a user