O módulo usa a identidade Supabase, isola cada workspace e registra storage, TTL, runner e biblioteca XLSX como decisões ainda abertas. Co-authored-by: Cursor <cursoragent@cursor.com>
1.9 KiB
Autenticação, workspace, permissões e RLS
Fluxo
- Supabase Auth (
getUser) quandoNEXT_PUBLIC_SUPABASE_URLe a anon key existem. - Workspace ativo no cookie
elo_pro_workspace_id, validado contraworkspace_members. - Fora de produção,
ADAPTER_DEV_AUTH=1aceita um cookie assinado sem senha, só para identidades já existentes no banco. - A flag
workspace_module_flags.module_key = spreadsheet_adapterprecisa estar ligada. - Logout chama
supabase.auth.signOut()e apaga o cookie local de desenvolvimento. src/proxy.tssó redireciona quem não tem cookie de sessão. A autorização real continua no servidor.
Não existe formulário de senha, tabela de credencial ou refresh token do Adaptador. Superadmin (profiles.is_superadmin) não ganha bypass dentro do módulo.
Fonte do workspace
O identificador vem do cookie de plataforma ou da sessão de desenvolvimento. Consultas usam o valor já validado no servidor. Payload do browser não escolhe o tenant.
Matriz
| Ação | Owner/Admin | Gestor/Agent |
|---|---|---|
| Usar módulo habilitado | Sim | Sim |
| Operar fonte, mapa, prévia, processo e download | Sim | Sim |
| Enviar modelo | Sim | Só se allow_non_admin_model_upload |
| Excluir modelo e alterar a flag de upload | Sim | Não |
RLS
migrations/0003_rls.sql liga e força RLS. O aplicativo faz set local role app_user e app.user_id. Funções security definer resolvem membership, flag, upload e job ativo sem vazamento entre workspaces. A conexão de serviço (worker, seed, flag, limpeza) não passa por app_user e permanece só no servidor.
Testes
tests/integration/rls.test.ts cobre leitura/escrita cruzada, insert bloqueado por RLS, flag desligada mesmo com contexto mentiroso e agent impedido de gravar settings. tests/integration/journey.test.ts cobre agent sem upload, upload após a setting e exclusão negada.