corentin_wakdo/src/app/Controllers/MeController.php
Corentin JOGUET f979a2339e
All checks were successful
CI / secret-scan (push) Successful in 8s
CI / php-lint (push) Successful in 19s
CI / static-tests (push) Successful in 33s
CI / auto-merge (push) Has been skipped
feat: RBAC P2 (autorisation par permission + garde de session + /api/me) (#12)
2026-06-15 20:45:19 +02:00

50 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Controllers;
use App\Core\Response;
/**
* GET /api/me : identite et permissions de l'utilisateur de la session courante.
*
* Premier consommateur reel de SessionGuard (RG-6 + RG-T02) et d'Authorizer
* (RG-T03) : la garde rejette toute session absente/expiree/inactive (401), sinon
* on renvoie le role et la liste des permissions rechargee depuis la base.
*
* NB P2 : les pages admin sont encore des fichiers statiques servis par Apache
* (hors PHP), donc non couvertes par cette garde. Leur protection arrive en P3
* quand elles deviennent des vues rendues serveur passant par ce socle.
*
* Non `final` a dessein : les tests sous-classent pour injecter des doubles
* (session en mode test + FakeDatabase) via les hooks proteges.
*/
class MeController extends AuthenticatedController
{
/**
* @param array<string, string> $params
*/
public function show(array $params = []): Response
{
$guard = $this->sessionGuard()->check();
if (!$guard->authenticated || $guard->userId === null || $guard->roleId === null) {
return $this->json(
['data' => null, 'error' => ['code' => 'AUTH_REQUIRED', 'message' => 'Authentification requise']],
401,
);
}
$authorizer = $this->authorizer();
return $this->json([
'data' => [
'user_id' => $guard->userId,
'role_id' => $guard->roleId,
'role_code' => $authorizer->roleCode($guard->roleId),
'permissions' => $authorizer->permissionsFor($guard->roleId),
],
]);
}
}