fix(review) : applique fixes blockers review PR #9 (permission guard, sites LAZY, audit UI stale)

- Permission entity : remplace le guard `ROLE_USER` par `core.permissions.view`
  sur GetCollection/Get. Le catalogue complet des permissions RBAC etait
  accessible a tout utilisateur authentifie. Ajoute la permission manquante
  dans CoreModule::permissions() et inverse les tests standardUser*
  (attendent maintenant un 403 pour un user sans la permission).

- UserRbacProcessor::restoreAbsentCollections() : force
  PersistentCollection::initialize() avant de lire le snapshot. Pour une
  association fetch=LAZY (ex: User::$sites), le snapshot est vide tant que
  la collection n'est pas materialisee, ce qui faisait vider silencieusement
  tous les sites d'un user sur un PATCH ne contenant pas la cle `sites`.

- admin/audit-log.vue : ajoute un catch sur loadEntries() qui reset
  entries/totalItems pour ne pas afficher de donnees stale si le fetch echoue
  (reseau coupe, 403 inopinee...). Le toast d'erreur reste gere par useApi.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-04-23 09:29:34 +02:00
parent 793e816f3e
commit bb6a4c387b
5 changed files with 30 additions and 7 deletions

View File

@@ -166,16 +166,19 @@ final class PermissionApiTest extends AbstractApiTestCase
self::assertResponseStatusCodeSame(401);
}
public function testStandardUserCanListPermissions(): void
public function testStandardUserWithoutPermissionIsForbiddenOnCollection(): void
{
// Le catalogue de permissions est accessible a tout utilisateur authentifie.
// Le catalogue de permissions est protege par `core.permissions.view` :
// un user authentifie sans cette permission (ni flag admin) doit
// recevoir un 403. Alice n'a que le role systeme "user" (zero
// permission attachee) — elle est le cobaye ideal pour ce test.
$client = $this->authenticatedClient('alice', 'alice');
$client->request('GET', '/api/permissions');
self::assertResponseIsSuccessful();
self::assertResponseStatusCodeSame(403);
}
public function testStandardUserCanGetPermission(): void
public function testStandardUserWithoutPermissionIsForbiddenOnItem(): void
{
$permission = $this->getEm()->getRepository(Permission::class)
->findOneBy(['code' => 'test.core.users.view'])
@@ -185,7 +188,7 @@ final class PermissionApiTest extends AbstractApiTestCase
$client = $this->authenticatedClient('alice', 'alice');
$client->request('GET', '/api/permissions/'.$permission->getId());
self::assertResponseIsSuccessful();
self::assertResponseStatusCodeSame(403);
}
private function cleanupTestPermissions(): void