RLS faz duas pessoas abrirem o mesmo dashboard e verem linhas diferentes — o gerente de Campinas vê Campinas, a de Sorocaba vê Sorocaba. Este tutorial mostra o caminho prático do ponto de vista do dashboard. A referência conceitual completa (estática × ABAC, planos, tetos, troubleshooting) está em Segurança por linha (RLS / ABAC).
Workspace do exemplo: Comércio Aurora Ltda (aurora), dashboard "Vendas por
filial".
Maturidade
A lógica de RLS (rowFilter v3, fail-closed) é GA-candidato, coberta por
testes. O isolamento entre clientes provado em produção (IAM em nuvem real) é
pendente. A RLS é aplicada na fonte única de leitura segura e respeitada pela
IA e pelos envios.
Duas formas de RLS#
- Estática
{column, values}— fixa os valores permitidos. Simples, mas exige um grant por pessoa; não escala além de poucas dezenas. - Por atributo do membro (ABAC)
{column, memberAttribute}— o grant diz de onde vem o valor; o valor mora no atributo do membro. Um grant serve centenas de pessoas. É o recomendado.
Pré-requisitos#
- Plano com RLS (a partir do Growth — ver Planos).
- Papel admin/owner para configurar grants e atributos.
- Dashboard publicado sobre um modelo com a coluna de recorte (ex.:
vendas.filial).
Passo a passo (ABAC, recomendado)#
Defina o atributo no membro
Em Usuários & permissões, dê ao membro o atributo
filial(ex.: "Campinas"). Ele vive no perfil do membro, sem coluna nova no banco. Ver Usuários, grupos e permissões.Crie o grant no dashboard
No painel de compartilhamento/segurança do dashboard, adicione o grant por atributo:
{column: "filial", memberAttribute: "filial"}.Publique
A RLS passa a valer na leitura segura do dashboard e no envio de relatórios.
Teste como cada perfil
Abra como o gerente de Campinas (vê só Campinas) e como o de Sorocaba (vê só Sorocaba).
Teste o fail-closed
Abra como alguém SEM o atributo
filial: deve ver zero linhas — nunca "tudo".
Resultado esperado#
- Campinas vê só Campinas; Sorocaba, só Sorocaba.
- Membro sem o atributo → denyAll (nenhuma linha), nunca "sem filtro".
- Multi-valor (ex.:
regiao = ["Sul", "Sudeste"]) vira cláusulaIN.
RLS atravessa export, envios e IA#
Este é o ponto que muita gente esquece — e que o ingestia.bi garante:
- Exportações (XLSX/CSV/PDF) leem o snapshot com a RLS do solicitante; o PDF sob demanda usa um token efêmero que carrega a RLS da sessão (ver Exportação e distribuição).
- Assinaturas por e-mail/WhatsApp aplicam RLS por destinatário (o filtro da assinatura soma com a RLS, nunca amplia).
- A IA lê a mesma visão segura da tela: o Q&A e os insights nunca veem mais do que quem perguntou vê (ver Q&A do dashboard e Privacidade, egress e orçamento).
Limites e ressalvas#
- RLS filtra linhas; para esconder colunas sensíveis use a permissão
viewPIIe a governança de PII (ortogonal à RLS). - Tetos por membro: até 20 atributos, chave ≤ 60 e valor ≤ 200 caracteres, até 50 valores por atributo.
- Isolamento entre clientes em produção (IAM real) é pendente — o desenho é fail-closed, mas a certificação de nuvem não ocorreu hoje.
Erros comuns#
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Pessoa vê zero linhas | atributo ausente/vazio (denyAll) | defina o atributo no perfil |
| Pessoa vê linhas demais | grant não configurado no dashboard | crie o grant {column, memberAttribute} |
| Atributo "não pega" | diferença de caixa/typo | a chave é normalizada; confira o nome |
| RLS não aplica no e-mail | assinatura sem RLS por destinatário | configure o filtro por destinatário |
Relacionados#
- Segurança por linha (RLS / ABAC)
- Papéis (RBAC)
- Tutorial: publicar e compartilhar
- Exportação e distribuição
Última revisão: 2026-09-08.