fix(users) : corrige l'affichage et l'ecrasement des sites sur le drawer RBAC
Le drawer RBAC de /admin/users initialisait l'etat des sites a partir du payload
/api/users (groupe user:list) qui n'expose pas la collection sites. Consequence :
la section "Sites autorises" affichait toujours 0 case cochee, et la sauvegarde
ecrasait silencieusement les sites existants en BDD.
- Ajout d'une operation GET /users/{id}/rbac (groupe user:rbac:read) dediee au
chargement du detail pour l'edition : payload list reste leger, detail riche
sur une URI symetrique au PATCH existant.
- Drawer charge desormais GET /users/{id}/rbac pour initialiser sites, roles
et directPermissions ; UserListItem ne contient plus sites (inutilise).
- Colonne "Sites" retiree de la table /admin/users : l'info est consultee via
le drawer, pas la liste (evite aussi la fuite cross-site pour les users avec
core.users.view mais sans sites.bypass_scope).
- Garde anti-ecrasement dans UserRbacProcessor : respect de la semantique
merge-patch+json (cle absente = preservee, cle = [] = vidage explicite).
Restaure les collections ManyToMany absentes du payload a partir du snapshot
Doctrine. Couvre roles, directPermissions et sites.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -51,6 +51,16 @@ use Symfony\Component\Serializer\Attribute\SerializedName;
|
||||
),
|
||||
new Post(security: "is_granted('core.users.manage')", processor: UserPasswordHasherProcessor::class),
|
||||
new Patch(security: "is_granted('core.users.manage')", processor: UserPasswordHasherProcessor::class),
|
||||
// Lecture dediee au drawer d'edition RBAC : meme URI que le PATCH pour une
|
||||
// API symetrique, groupe `user:rbac:read` qui expose sites/roles/directPermissions.
|
||||
// Garde `core.users.manage` (pas `.view`) car c'est l'endpoint de detail prevu
|
||||
// pour l'edition, pas la consultation generale (elle passe par GET /users/{id}).
|
||||
new Get(
|
||||
name: 'user_rbac_get',
|
||||
uriTemplate: '/users/{id}/rbac',
|
||||
security: "is_granted('core.users.manage')",
|
||||
normalizationContext: ['groups' => ['user:rbac:read']],
|
||||
),
|
||||
new Patch(
|
||||
name: 'user_rbac_patch',
|
||||
uriTemplate: '/users/{id}/rbac',
|
||||
|
||||
Reference in New Issue
Block a user