| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- <?php
- namespace Middlewares;
- use Libs\Logger;
- use Libs\Payload;
- use Psr\Http\Message\ServerRequestInterface;
- /**
- * Autorização baseada em papel (RBAC).
- *
- * Deve ser registrada SEMPRE depois do JwtAuthMiddleware, que popula o
- * atributo "user_role" a partir do banco. Bloqueia (403) quando o papel do
- * usuário autenticado não está na lista de papéis permitidos para a rota.
- *
- * Uso na rota:
- * $app->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);
- }
- }
|