Skip to content

Regras de Permissões (RBAC)

Modelo de permissões

Cada usuário tem um papel (role) que contém uma lista de permissões (strings). Os guards verificam se o papel do usuário tem a permissão necessária.

Usuário → Papel (Role) → Permissões (string[])

Lógica: OR entre permissões de um endpoint. Se o papel tem qualquer uma das permissões declaradas, o acesso é liberado.

Lista de permissões

PermissãoAcesso
app:dashboardDashboard de performance (KPIs, histórico de vendas)
app:customersListar e buscar clientes
app:customers:deleteDeletar registros de clientes
app:financialsVer dados financeiros de clientes (LTV, histórico)
app:salesAnalytics de varejo, canais, origem, qualidade
app:segmentsCriar e gerenciar segmentos e análise RFM
app:exportDownload de CSV em todas as telas
app:campaignsVer e criar campanhas
app:campaigns:sendDisparar campanhas
app:integrationsWhatsApp, Chatwoot, templates, rate limits, ERP sync
app:settingsConfigurações de loja, organização, campanhas
app:teamConvidar e gerenciar usuários
app:rolesCriar e editar papéis e permissões
app:auditVer log de auditoria
app:store-aliasesGerenciar hierarquia de lojas

Hierarquia de nível (level)

Cada papel tem um level numérico. Menor número = maior privilégio.

LevelPapel padrãoAcesso
0Super AdminTudo — bypassa todos os guards
1–4Admin / GestorNível alto de acesso
5–7Analista / OperadorAcesso intermediário
8–10Usuário padrãoAcesso básico

Papel somente-leitura (readOnly)

Papéis com readOnly: true não podem executar mutações (POST, PUT, PATCH, DELETE), independente das permissões listadas. Ideal para auditores ou observadores.

Exceção: Super Admin (level 0) nunca é read-only.

Proteção contra escalonamento de privilégios

  • Usuário não pode criar papel com level igual ou menor ao seu próprio
  • Usuário não pode atribuir papel com level igual ou menor ao seu a outro usuário
  • Usuário não pode alterar seu próprio papel (exceto Super Admin)
  • Usuário só pode gerenciar usuários da sua própria organização

Exemplo: Um usuário com level 5 pode criar papéis de level 6+ e atribuir para outros. Não pode criar papéis de level 5 ou menor.

Override de organização (Super Admin)

Super Admin pode impersonar qualquer organização passando o header:

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

Isso é logado automaticamente no middleware HTTP.

Acesso por loja

Usuários podem ter acesso restrito a lojas específicas (accessibleStores). Quando configurado, queries de dados são filtradas para retornar apenas dados das lojas acessíveis.

Guards em ordem de execução

Request
  → ClerkAuthGuard (valida JWT)
  → TenantInterceptor (define organizationId no contexto)
  → PermissionsGuard (verifica permissões do papel)
  → ReadOnlyGuard (bloqueia mutações se readOnly)
  → UserThrottlerGuard (rate limiting por usuário)
  → Controller
  → AuditInterceptor (loga ação na saída)

Endpoints de sistema interno (Internal API Key)

Endpoints chamados por n8n ou outros serviços internos usam INTERNAL_API_KEY em vez de JWT do Clerk. O guard compara o header com timing-safe compare para evitar timing attacks.

http
Authorization: Bearer {INTERNAL_API_KEY}