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(ousb_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.