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

ErroO que acontece
Nunca ativar RLSA tabela inteira é leitura/escrita pública
Política using ( true )"Existe política" mas libera todos: igual a sem proteção
insert sem with checkUsuários criam linhas em nome de outros
Chave service-role no clienteIgnora 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.

Artigos relacionados