Conectar o Supabase à Lovable resolve banco de dados, autenticação e backend rapidamente. Mas existe uma etapa que não deve ser tratada como detalhe: garantir que um usuário não consiga consultar ou alterar os dados de outro. É exatamente aí que entra o RLS.

Por que RLS importa em um projeto Lovable

Apps criados na Lovable normalmente acessam o Supabase pelo frontend usando uma chave publicável. Essa chave identifica o projeto, mas não é uma senha que protege cada registro. A proteção real dos dados expostos pela Data API vem das permissões do Postgres combinadas com as políticas de RLS.

Entenda o modelo antes de criar políticas

  • Autenticação confirma quem é o usuário
  • O JWT carrega a identidade da sessão
  • RLS usa essa identidade para decidir quais linhas podem ser acessadas
  • Uma policy funciona como um filtro aplicado às operações no banco
  • A service role ignora RLS e nunca deve ficar no frontend

Passo 1: identifique quais tabelas guardam dados de usuários

Comece pelas tabelas que armazenam informações privadas ou pertencentes a uma conta: perfis, pedidos, projetos, tarefas, mensagens, documentos, agendamentos e dados financeiros. Para cada uma, responda: quem é o dono desta linha?

Passo 2: habilite RLS nas tabelas expostas

No Supabase, abra a área de políticas da tabela e confirme que Row Level Security está habilitado. Tabelas criadas pelo Table Editor normalmente já recebem RLS por padrão; tabelas criadas por SQL ou outros fluxos precisam ser verificadas.

Passo 3: crie a regra de leitura por usuário

Para uma tabela em que cada registro pertence a um usuário, a regra mais comum compara auth.uid() com a coluna user_id. Em linguagem simples: o usuário autenticado só pode selecionar linhas cujo dono seja ele mesmo.

Passo 4: proteja também criação, edição e exclusão

Uma policy de leitura não protege automaticamente INSERT, UPDATE e DELETE. Para inserir, valide que o user_id do novo registro pertence à sessão. Para atualizar, use uma condição para a linha existente e outra para garantir que a linha resultante continue pertencendo ao mesmo usuário. Para excluir, restrinja a operação ao dono do registro.

  • SELECT: usuário lê apenas as próprias linhas
  • INSERT: novo registro precisa pertencer ao usuário autenticado
  • UPDATE: usuário só altera a própria linha e não pode trocar o proprietário
  • DELETE: usuário só remove a própria linha

Passo 5: peça à Lovable para implementar com contexto

O prompt funciona melhor quando você informa quais dados devem ser públicos e quais são privados. Não peça apenas para deixar o banco seguro: descreva quem deve poder fazer o quê.

Nem toda tabela precisa ser privada

Um catálogo público, posts publicados ou configurações que todos podem ler podem ter políticas diferentes. RLS não significa bloquear tudo; significa transformar a regra de negócio em autorização explícita. Uma tabela pode permitir leitura pública e restringir escrita a usuários autorizados.

Como testar RLS antes de publicar o app

  1. Crie dois usuários de teste diferentes
  2. Entre como o usuário A e crie um registro
  3. Confirme que o usuário A consegue ler e editar o próprio registro
  4. Entre como o usuário B
  5. Tente acessar o registro criado pelo usuário A
  6. Teste criação, edição e exclusão com ambos
  7. Repita o teste nas tabelas que guardam dados sensíveis

Ver a interface funcionando não prova que o banco está protegido. O teste precisa confirmar que uma sessão autenticada não consegue acessar linhas de outro usuário mesmo tentando consultar a tabela diretamente pelo fluxo do aplicativo.

Erros comuns de RLS em projetos Lovable

  • Habilitar RLS e esquecer de criar as policies necessárias
  • Criar policy para SELECT e esquecer UPDATE ou DELETE
  • Usar uma condição aberta em tabela com dados privados
  • Confiar apenas em esconder botões na interface
  • Usar user_metadata como base de autorização sensível
  • Colocar service role ou secret key no frontend
  • Não testar com dois usuários diferentes
  • Criar UPDATE sem a política de SELECT correspondente

Por que UPDATE costuma confundir

O Supabase documenta que uma operação UPDATE também precisa de uma policy de SELECT correspondente para funcionar como esperado. Além disso, é recomendável validar tanto a linha atual quanto o resultado da atualização, evitando que alguém troque o user_id e transfira um registro para outra conta.

Nunca coloque service role no frontend da Lovable

A chave de service role ou uma secret key é destinada a ambientes confiáveis de backend e pode ignorar RLS. No navegador, use a chave publicável apropriada e deixe as políticas decidirem o acesso com base na sessão. Segredos administrativos devem ficar em backend ou secrets.

Já conectou Supabase? Fortaleça o projeto em vez de refazer

Se você ainda está configurando banco, login e backend, comece pelo guia Como conectar Supabase na Lovable: https://lovacademy.com.br/blog/como-conectar-supabase-na-lovable. Depois volte a este checklist de RLS antes de trabalhar com usuários reais.

Se seu projeto usa Edge Functions ou será publicado fora da plataforma, veja também o guia de deploy e Supabase: https://lovacademy.com.br/blog/deploy-lovable-vercel-edge-functions-supabase.

Checklist de RLS para vibe coders

  • Mapeei as tabelas com dados privados
  • Cada linha privada possui uma forma clara de identificar o dono
  • RLS está habilitado nas tabelas expostas
  • SELECT está restrito corretamente
  • INSERT valida o proprietário
  • UPDATE possui USING e WITH CHECK adequados
  • DELETE está restrito
  • Nenhuma service role está no frontend
  • Testei o app com pelo menos dois usuários
  • Revisei tabelas públicas separadamente

Criar um projeto na Lovable

Fontes oficiais

  • Supabase Docs — Row Level Security: https://supabase.com/docs/guides/database/postgres/row-level-security
  • Supabase Docs — Securing your API: https://supabase.com/docs/guides/api/securing-your-api
  • Supabase Docs — Securing your data: https://supabase.com/docs/guides/database/secure-data

Perguntas frequentes

O que é RLS no Supabase?
Row Level Security é o sistema de políticas do Postgres usado para controlar quais linhas cada usuário pode acessar ou modificar.
Preciso de RLS em um projeto criado na Lovable?
Se seu app acessa tabelas expostas pela Data API, especialmente com dados privados por usuário, RLS é uma camada essencial de autorização.
Ativar RLS sozinho protege a tabela?
Ao habilitar RLS, o acesso via chave publicável fica bloqueado até que policies permitam as operações necessárias. Por isso é preciso configurar políticas coerentes com o app.
Posso usar auth.uid() para separar dados por usuário?
Sim. Esse é um padrão documentado pelo Supabase quando a tabela possui uma coluna que identifica o proprietário da linha.
A service role respeita RLS?
Chaves administrativas de serviço podem ignorar RLS e nunca devem ser expostas no frontend.
Por que meu UPDATE parou de funcionar depois do RLS?
Uma causa comum é faltar a policy de SELECT correspondente ou a regra de UPDATE não permitir a linha atual ou o novo estado da linha.

Receba os novos artigos por e-mail

Continue lendo

Lovable - Como definir o domínio principal na Lovable e configurar o www corretamente
Deploy e Infraestrutura

Como definir o domínio principal na Lovable e configurar o www corretamente

Aprenda a definir o domínio principal na Lovable, conectar a versão www e evitar URLs concorrentes, DNS duplicado e redirecionamentos inesperados.

8 min de leitura
Lovable - Lovable Workspace Insights: como acompanhar adoção e uso dos seus apps
Novidades da Lovable

Lovable Workspace Insights: como acompanhar adoção e uso dos seus apps

O Workspace Insights da Lovable mostra visitas aos apps publicados, apps e builders ativos, conexões adicionadas e os projetos mais usados do workspace em uma visão de 30 dias.

8 min de leitura
Lovable - Como usar subdomínio na Lovable sem mexer no domínio principal
Deploy e Infraestrutura

Como usar subdomínio na Lovable sem mexer no domínio principal

Aprenda a conectar um subdomínio à Lovable sem alterar o site que já funciona no domínio principal, com DNS, SSL e troubleshooting prático.

7 min de leitura