Pular para o conteúdo
Todos os artigos
4 min de leitura

O teu workspace é uma fronteira de segurança.

Porque as verificações de propriedade pertencem a cada leitura e escrita, e porque um URL de tarefa nunca deve conceder acesso.

a equipa supastack

Deriva a propriedade no servidor

Um ID de registo identifica algo; não prova quem o pode ler. O supastack delimita os registos de utilizador por workspaceId. O servidor resolve o workspace do utilizador autenticado e inclui esse limite ao ler ou modificar um registo.

Não trates um ID de workspace enviado pelo browser como prova de propriedade. O browser pode pedir uma ação, mas o contexto de servidor de confiança deve estabelecer de quem ela é. Esta regra deve valer para estado de tarefa, configuração de fornecedor guardada, registos de utilização e cada recurso próprio do produto. Layouts e componentes podem filtrar o que é renderizado, mas renderizar não é autorização — a verificação pertence ao lugar onde o registo é realmente lido ou escrito.

Tudo o resto neste post segue dessa regra: a propriedade é derivada, nunca pedida. No momento em que um workspaceId enviado pelo cliente é confiado em algum lugar, todas as outras verificações passam a decoração. O post de autenticação cobre como a própria sessão é estabelecida a montante desta fronteira.

Ser membro faz parte da fronteira

A delimitação responde a que workspace pertence um registo; a condição de membro responde se este utilizador pertence a esse workspace. Resolve ambas no servidor. O supastack modela workspaces pessoais e de organização com papéis de owner, admin e member — o guia de workspaces documenta o modelo.

Os papéis acrescentam um segundo eixo: um membro pode ler o que só um admin pode mudar. Mantém as duas verificações distintas — «pertence a este workspace» e «pode executar esta ação» — para que uma despromoção ou remoção faça efeito na mesma fronteira que todo o resto. Convites e remoções fazem parte do mesmo ciclo de vida, não são uma reflexão tardia de admin.

As mudanças de membros também têm de fazer efeito de imediato. O pedido seguinte de um membro removido deve falhar na fronteira, não quando um token em cache expirar por acaso — mais uma razão para a verificação viver onde os registos são lidos, em vez de dentro de uma credencial emitida antes.

Testa os pedidos que devem falhar

Um teste que deixa um proprietário obter um registo prova o caminho feliz. Não prova o isolamento. Combina-o com um segundo workspace a pedir o mesmo registo, um pedido anónimo e uma escrita que tente substituir outro proprietário.

Afirma o comportamento externo tanto como o resultado persistido. Um pedido rejeitado não deve mutar os dados de outro workspace, e uma resposta de erro não deve expor segredos nem detalhes crus da base. Estas verificações mantêm a fronteira revista quando a implementação muda.

  • Um segundo workspace pede o mesmo ID de registo — rejeitado.
  • Um pedido anónimo atinge o mesmo endpoint — rejeitado.
  • Um membro removido do workspace tenta de novo — rejeitado.
  • Uma escrita nomeia outro dono ou workspace — rejeitada, sem nada mutado.
  • As respostas de erro mantêm-se genéricas — sem segredos, sem detalhes de schema.

Leva a regra para o teu produto

Quando adicionares uma nova tabela de produto, decide a sua propriedade antes de construir o ecrã. Inclui workspaceId no seu modelo de persistência, resolve o workspace através da fronteira de servidor existente e usa esse contexto tanto em operações de lista como de detalhe.

Os workers em segundo plano exigem o mesmo cuidado. Uma tarefa em fila deve carregar contexto de confiança suficiente para carregar o registo correto, enquanto as credenciais de fornecedor ficam no servidor. Uma regra de propriedade consistente é mais fácil de manter do que uma coleção de exceções por rota.

A superfície de API pertence à mesma fronteira. As chaves de API de workspace e os webhooks de saída assinados transportam consigo o âmbito do workspace — uma chave nunca pode tornar-se uma forma de ler entre tenants, e um payload de webhook nunca pode carregar os registos de um vizinho. O guia do módulo de API cobre a forma dessa superfície.

Perguntas frequentes sobre isolamento de workspaces

O isolamento multi-tenant levanta o mesmo punhado de perguntas em cada projeto. Estas são as que vale a pena resolver cedo.

  • A delimitação ao nível da aplicação chega, ou preciso de row-level security? — A delimitação aplicada pelo servidor em cada leitura e escrita cobre o modelo de ameaças da maioria dos SaaS. O RLS da base de dados acrescenta defesa em profundidade, mas não substitui as verificações de fronteira — workers e chaves de API continuam a precisar da mesma regra.
  • Como deve funcionar a partilha entre workspaces? — Modela-a explicitamente — um convite, uma linha de membro — em vez de enfraquecer o âmbito. «Qualquer pessoa com o link» deve ser uma funcionalidade desenhada com as suas próprias verificações, não um acidente.
  • O que parte primeiro em apps multi-tenant? — Os caminhos de conveniência: links de recuperação, ferramentas de admin, workers em segundo plano que carregam registos por ID simples. Audita cada caminho de código que toca num registo sem passar pelo âmbito normal.
  • Como adiciono delimitação a uma tabela existente? — Adiciona workspaceId, preenche-o retroativamente, aplica-o em leituras e escritas, depois toca na UI. Lança primeiro os testes negativos para que a fronteira fique provada em vez de assumida.
  • As ações de servidor precisam de verificações se a página estiver protegida? — Sim. As guardas de página escondem ecrãs; não autorizam operações. Cada ação resolve a sessão e o workspace independentemente.

Perguntas frequentes

14 perguntas

O que é o supastack?

O supastack é uma base modular para construir produtos SaaS com IA. Reúne a infraestrutura comum para que possas concentrar-te nas funcionalidades próprias do teu produto.

Suporta web e mobile?

Sim. O supastack inclui apps Next.js e Expo como pontos de partida para experiências web e mobile.

Que autenticação está incluída?

O Better Auth cobre email/palavra-passe, OTP e login social. Os workspaces pessoais são aprovisionados com a conta para que os registos fiquem delimitados desde o primeiro dia.

Como é suportada a IA?

O supastack inclui IA multi-fornecedor configurável, registo de utilização, orçamentos e suporte encriptado de chaves próprias (BYOK).

Como são geridas as subscrições?

Para produtos construídos sobre o kit, a faturação Stripe, as subscrições e as permissões formam a base do acesso pago. Os segredos de fornecedor ficam no servidor.

Onde vive o código próprio do meu produto?

As funcionalidades próprias do produto ficam num codebase separado, enquanto o produto configura e integra os módulos base do supastack.

Como funciona o preço do supastack?

O kit é uma compra única com atualizações vitalícias: Uma framework por 249 $ (preço de lançamento temporário — 100 $ de desconto sobre o preço normal de 349 $) ou Todas as frameworks (Next.js, iOS, Android) por 499 $ (preço de lançamento temporário — 100 $ de desconto sobre o preço normal de 599 $), mais 75 $ por lugar de programador adicional. Sem subscrição do kit. O checkout neste site entrega a tua chave de licença por email, com acesso ao repo por convite GitHub.

Como é que os workspaces delimitam os meus dados?

Os registos do utilizador são delimitados por workspaceId. Identidade, permissões, utilização de IA, eventos de faturação e entradas de auditoria ficam dentro do limite do workspace pessoal.

Como funcionam os jobs em segundo plano?

O Trigger.dev é o runtime de jobs explícito. O contrato JobRunner só promete enqueue, status e cancel — a semântica de workflow permanece específica e explícita do Trigger.dev.

Como difere o email da divulgação?

O email transacional cobre fluxos de produto como avisos de conclusão de tarefas. A divulgação fria e as campanhas pertencem ao próprio produto, fora do módulo de email deste kit.

Como funcionam as compras no aplicativo móvel?

O aplicativo móvel inclui compras nativas e restauração via RevenueCat, com acesso verificado pelo servidor. Configure as contas das lojas e conclua os testes em dispositivos antes de publicar. A cobrança web permanece separada.

Onde residem as chaves dos fornecedores de IA?

As credenciais BYOK são encriptadas e ficam no servidor. As chaves são higienizadas nos logs; a utilização e os orçamentos ficam visíveis ao nível do workspace.

Quais métodos de pagamento o checkout aceita?

O checkout hospedado na Stripe aceita cartões e também pode oferecer Alipay e WeChat Pay quando essas carteiras estiverem ativadas na conta Stripe — útil para compradores na China. As autorizações de carteira são confirmadas de forma assíncrona, então a página da licença é atualizada assim que o pagamento é liquidado.

Posso solicitar um reembolso?

Depois de obter acesso ao repositório, o supastack é seu para sempre, portanto não pode ser reembolsado. Mas fique tranquilo: você recebe o código-fonte completo com atualizações vitalícias para criar e lançar produtos ilimitados para você ou seus clientes. Você apenas não pode revender o código nem redistribuir o repositório como starter kit ou modelo.

PT