kiliokatsu

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.

supabase/migrations/0001_reconstrucao_v3.sqlsql
-- 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.

supabase/migrations/0001_reconstrucao_v3.sqlsql
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?

kiliokatsu, assinado

Escrito por Vinícius · desenvolvedor de sistemas · ver perfil →