- UserRbacProcessor : persist + ensureCurrentSiteConsistency wrappes dans
wrapInTransaction (plus de double flush non atomique qui pouvait laisser
currentSite orphelin sur un crash entre les deux flush).
- UserRbacProcessor : detecte la mutation de `sites` via
PersistentCollection::isDirty() et verifie is_granted('sites.manage')
avant de deleguer (empeche core.users.manage de contourner sites.manage).
- UserRbacProcessor : skip ensureCurrentSiteConsistency si ni sites ni
currentSite n'ont ete modifies (plus de bascule silencieuse de site sur
un simple toggle isAdmin apres suppression de site).
- CurrentSiteProcessor : refresh($user) avant hasSite() pour fermer la
fenetre TOCTOU entre /rbac revoke et /me/current-site. Catch
OptimisticLockException pour etre pret a un futur @ORM\Version.
- SiteAwareInjectionProcessor : valide un site explicite contre
$user->getSites() (bypass via sites.bypass_scope) — bloque le cross-site
write quand l'entite expose `site` en ecriture.