Skip to content

Autorização (RBAC)

Guards disponíveis

GuardArquivoFunção
ClerkAuthGuardconfig/users/clerk-auth.guard.tsValida JWT do Clerk
RolesGuardconfig/users/roles.guard.tsVerifica nível hierárquico do papel
PermissionsGuardcommon/guards/permissions.guard.tsVerifica permissões específicas
ReadOnlyGuardcommon/guards/read-only.guard.tsBloqueia mutações para roles read-only
UserThrottlerGuardcommon/guards/user-throttler.guard.tsRate limiting por usuário
InternalApiKeyGuardcommon/guards/internal-api-key.guard.tsAuth para serviços internos
AdminGuardmodules/admin/admin.guard.tsRestringe a Super Admin (level 0)

Decorators de autenticação

typescript
// Endpoint público (sem auth)
@Public()

// Requer permissão específica (OR entre as listadas)
@Permissions('app:campaigns', 'app:campaigns:send')

// Requer papel específico
@Roles('super_admin')

// Injeta usuário atual no parâmetro
@CurrentUser() user: AuthedUser

Isolamento de tenant

O TenantInterceptor roda após o ClerkAuthGuard e define o contexto de organização via AsyncLocalStorage. Todos os services acessam TenantContext.organizationId para garantir que nenhuma query retorne dados de outra organização.

Override de Super Admin

http
x-org-id: {uuid-da-organizacao}

Apenas Super Admin (level 0) pode usar esse header. Permite administrar qualquer organização. É logado automaticamente.

Proteção contra escalação de privilégios

O sistema valida:

  1. Quem convida precisa ter level <= 10
  2. Papel atribuído deve ter level > nível do convidante
  3. Usuário não pode alterar seu próprio papel

Exemplo: Usuário level 5 só pode:

  • Criar papéis com level 6, 7, 8...
  • Atribuir papéis com level 6+ para outros

Read-only mode

Roles com readOnly: true só podem fazer GET requests. Qualquer tentativa de POST, PUT, PATCH ou DELETE retorna 403.

Uso: auditores, observadores, integrações de leitura.

Rate limiting

O UserThrottlerGuard rastreia por:

  • Usuário autenticado: user-{userId}
  • Anônimo: IP da conexão

Limites por endpoint:

  • POST /users/invite: 30/60s
  • PATCH /users/:id/role: 20/60s

Internal API Key (serviços internos)

Endpoints chamados por n8n, scripts ou outros serviços backend usam:

http
Authorization: Bearer {INTERNAL_API_KEY}

Implementado com crypto.timingSafeEqual() para evitar timing attacks. Falhas são logadas com IP e path.

Visibilidade de dados por loja

Usuários podem ter accessibleStores — lista de IDs de lojas que podem visualizar. Se preenchido, queries de analytics e relatórios filtram apenas essas lojas.