GRANT e POLICY são dois portões (e eu confundia os dois)
Liguei login por GitHub no meu painel e descobri na prática que autenticar é aberto e autorizar é uma lista de uma linha. A diferença entre GRANT e POLICY é o que impede o site inteiro de virar terra de ninguém.
Todo tutorial de Supabase manda ligar a Row Level Security e pronto, como se RLS fosse um interruptor de segurança. Só que quando eu fui desenhar quem pode escrever no meu próprio site, descobri que a resposta certa são dois portões diferentes — e que confundir os dois é o jeito mais comum de errar.
O problema que me trouxe até aqui
Eu queria login no painel pelo GitHub, porque é a conta que eu já uso. Dito isso, tem uma pegadinha: com OAuth do GitHub, qualquer pessoa com conta no GitHub consegue se autenticar no meu projeto. Autenticar é aberto por natureza.
Autenticado não é autorizado. São duas perguntas diferentes: "quem é você?" e "o que você pode fazer aqui?"
O primeiro portão: GRANT
O GRANT é a permissão ampla do Postgres — ele diz que o papel authenticated PODE, em tese, tocar na tabela. Sem GRANT, nem a política mais generosa funciona.
-- permissão ampla: o papel pode chegar até a porta
grant select, insert, update, delete on posts to authenticated;O segundo portão: POLICY
A POLICY é a autorização estreita — linha por linha, ela pergunta ao banco se ESTE usuário pode tocar NESTA linha. A minha exige estar numa tabela admins que tem exatamente uma linha: eu.
create policy "admin edita" on posts for update
to authenticated using (is_admin()) with check (is_admin());Eu vi os dois portões funcionando na tela
Acredito eu que a melhor parte foi testar de verdade: loguei com o GitHub no meu painel e recebi na tela "autenticado não é autorizado" — o meu próprio login, recusado pelo banco, porque a linha em admins ainda não existia. Inseri a linha, recarreguei, e a fila de rascunhos apareceu. Nenhuma dessas decisões mora no JavaScript: se alguém burlar a tela inteira, o INSERT volta recusado com 42501.
O que eu levo disso
Permissão ampla, autorização estreita. O GRANT abre o corredor, a POLICY guarda cada porta. E o teste que tentou escrever sem estar alistado — e falhou — vale mais que qualquer diagrama.
Fica a pergunta que eu ainda não sei responder: em que tamanho de equipe uma tabela admins preenchida à mão deixa de ser suficiente?
Escrito por Vinícius · desenvolvedor de sistemas · ver perfil →