Se o seu app é construído no Supabase, Row Level Security (RLS) não é opcional, é a única coisa que separa um usuário logado dos dados de todos os outros. E é o que mais sai errado em apps vibe-coded ou feitos com pressa.
Por que RLS importa tanto no Supabase
Em um app Supabase, o navegador fala direto com o banco usando a chave anon (pública). Por isso o próprio banco precisa aplicar as permissões: o cliente não é confiável. O RLS é essa camada.
// Roda no navegador, com uma chave que qualquer um pode ler:
const { data } = await supabase.from('orders').select('*')Com RLS desligado, essa query retorna todos os pedidos de todos os clientes. Com RLS ligado e uma política correta, retorna apenas os do usuário atual.
RLS não vem ligado por padrão
Uma tabela criada no SQL editor tem RLS desativado. Sem RLS não há restrição: qualquer um com a chave anon (que é pública) lê e escreve a tabela inteira.
-- Ative RLS em cada tabela
alter table orders enable row level security;Atenção: ativar RLS sem políticas nega todo o acesso. O app parece quebrado. A solução é adicionar políticas, não desligar o RLS de novo.
Escrevendo políticas RLS
-- Cada usuário lê apenas seus próprios pedidos
create policy "read own orders"
on orders for select
using ( auth.uid() = user_id );
-- Insere apenas como ele mesmo
create policy "insert own orders"
on orders for insert
with check ( auth.uid() = user_id );using filtra quais linhas aparecem; with check valida as novas. Escreva as duas em operações de escrita.
Os erros de RLS que vazam dados
| Erro | O que acontece |
|---|---|
| Nunca ativar RLS | A tabela inteira é leitura/escrita pública |
Política using ( true ) | "Existe política" mas libera todos: igual a sem proteção |
insert sem with check | Usuários criam linhas em nome de outros |
| Chave service-role no cliente | Ignora o RLS por completo |
Como verificar se o RLS protege você
-- Tabelas com RLS desligado
select tablename, rowsecurity
from pg_tables
where schemaname = 'public' and rowsecurity = false;E escaneie o código: você conecta o GitHub e o Nurbak escaneia o repositório do seu app Supabase, sinaliza tabelas sem policies de RLS, além de checagens de auth faltando e chaves expostas no código ou no histórico do git, e pode abrir um PR com a correção. O primeiro scan é grátis.
