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 app no ar: o Nurbak testa seu app Supabase de fora e sinaliza tabelas publicamente legíveis, além de chaves expostas e headers faltando. Cole sua URL e veja o relatório em segundos.

