← Guias
6 min de leitura

RLS no Supabase: o que é, como saber se está desligada e como ligar

Sem RLS, qualquer visitante lê e altera suas tabelas no Supabase usando a chave pública do seu próprio site. Veja como conferir e ligar, com o SQL pronto.

No Supabase, o site conversa com o banco direto do navegador, usando a chave pública (a anon, ou a nova sb_publishable_…). Isso é normal e seguro — desde que cada tabela diga quem pode ver e mudar o quê. Quem diz isso é a RLS, Row Level Security.

Sem RLS, a tabela fica aberta: qualquer pessoa que abrir as ferramentas do navegador pega a chave pública do seu site e lê, altera ou apaga os dados de todos os usuários pela API do Supabase.

Como saber se a RLS está desligada

No painel do Supabase, o Table Editor mostra um aviso nas tabelas sem RLS, e o Security Advisor lista cada uma. Para conferir tudo de uma vez, rode no SQL Editor:

select tablename, rowsecurity
from pg_tables
where schemaname = 'public'
order by tablename;

Toda linha com rowsecurity = false é uma tabela aberta.

Como ligar, do jeito certo

Ligar a RLS sem política nenhuma fecha a tabela para todo mundo — é seguro, mas o app para de funcionar. O certo é ligar e dizer, em seguida, quem pode fazer o quê. O caso mais comum: cada usuário só mexe nas próprias linhas.

alter table public.pedidos enable row level security;

create policy "cada um vê os seus pedidos"
  on public.pedidos for select
  using (auth.uid() = user_id);

create policy "cada um cria os seus pedidos"
  on public.pedidos for insert
  with check (auth.uid() = user_id);

create policy "cada um altera os seus pedidos"
  on public.pedidos for update
  using (auth.uid() = user_id)
  with check (auth.uid() = user_id);

O erro que parece correção: using (true)

Quando o app quebra depois de ligar a RLS, é comum a IA sugerir uma política using (true). Ela devolve o funcionamento — e reabre a tabela para todos. RLS ligada com using (true) é, na prática, RLS desligada.

  • Conteúdo realmente público (catálogo, posts publicados) pode ter leitura aberta — mas escrita, nunca.
  • Dados pessoais (clientes, pedidos, mensagens) sempre filtrados por auth.uid().
  • A chave service_role (ou sb_secret_…) ignora a RLS: ela só pode existir no servidor.

Mudou uma política? Teste logado como um usuário comum e confira que ele não enxerga as linhas de outro. É o único teste que prova que a regra funciona.

Dicas curtas de segurança para quem cria com IA: siga @npx_vibedefender no Instagram.