post('/v1/register', $authJwt, new RoleMiddleware('admin'), Controller::class); */ class RoleMiddleware { /** @var string[] */ private array $allowedRoles; public function __construct(string ...$allowedRoles) { // Normaliza para comparação case-insensitive e estável. $this->allowedRoles = array_map( static fn (string $role): string => mb_strtolower(trim($role)), $allowedRoles ); } public function __invoke(ServerRequestInterface $request, callable $next) { $role = mb_strtolower(trim((string) $request->getAttribute('user_role', ''))); if ($role === '' || !in_array($role, $this->allowedRoles, true)) { Logger::warning('Access denied by role policy', [ 'user_id' => $request->getAttribute('user_id'), 'role' => $role, 'allowed' => $this->allowedRoles, ]); return Payload::fail('Forbidden: insufficient permissions', [], 'E_FORBIDDEN', 403); } return $next($request); } }