saas-multi-tenant
Ajuda seu agente a criar sistemas onde vários clientes usam o mesmo software de forma segura. Garante que os dados de um cliente não sejam vistos por outro.
O que ela faz
Esta ferramenta ajuda a criar aplicativos onde vários clientes (ou 'inquilinos') compartilham o mesmo banco de dados de forma segura. Ela garante que cada cliente só veja seus próprios dados.
Quando usar
- ✓Ao construir um aplicativo SaaS para múltiplos clientes.
- ✓Quando você precisa isolar os dados de cada cliente.
- ✓Ao implementar segurança para que clientes não vejam dados uns dos outros.
Exemplo do que pedir para a IA
“Como posso garantir que os dados de um cliente não sejam vistos por outro no meu aplicativo SaaS?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ela configura o banco de dados para adicionar uma coluna de identificação do cliente em cada tabela e usa regras de segurança para filtrar os dados automaticamente. Também cria um 'meio de campo' que define qual cliente está acessando os dados a cada requisição.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill saas-multi-tenantOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/saas-multi-tenant/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Arquitetura Multi-Tenant para SaaS
Quando Usar Esta Habilidade
- O usuário está construindo um aplicativo SaaS onde vários clientes compartilham o mesmo banco de dados
- O usuário pergunta sobre isolamento de tenant, segurança em nível de linha ou prevenção de vazamento de dados
- O usuário precisa delimitar todas as consultas ao banco de dados para um tenant específico sem cláusulas WHERE manuais
- O usuário pergunta sobre as compensações entre schema compartilhado vs schema por tenant vs banco de dados por tenant
- O usuário está implementando endpoints de administrador que devem acessar dados entre tenants
- O usuário precisa adicionar colunas
tenant_ida um aplicativo existente de tenant único - O usuário pergunta sobre políticas de RLS (Row-Level Security) do PostgreSQL para isolamento de tenant
- O usuário está construindo middleware ciente de tenant em rotas de API Express, Fastify ou Next.js
NÃO use esta habilidade quando:
- O usuário está construindo um aplicativo para um único usuário sem infraestrutura compartilhada
- O usuário pergunta apenas sobre autenticação sem escopo de tenant (use uma habilidade de autenticação em vez disso)
- O usuário precisa de design geral de schema de banco de dados sem requisitos de multi-tenancy
Fluxo de Trabalho Principal
Determine o modelo de tenancy. Pergunte ao usuário sobre suas expectativas de escala e requisitos de isolamento. Para a maioria dos aplicativos SaaS com menos de 1000 tenants, schema compartilhado com uma coluna
tenant_idem cada tabela é o padrão correto. Schema por tenant adiciona sobrecarga operacional (migrações executadas N vezes). Banco de dados por tenant só é justificado quando os tenants têm requisitos regulatórios de residência de dados.Adicione
tenant_ida todas as tabelas com escopo de tenant. A coluna deve serNOT NULL, do tipoUUIDouTEXT, e incluída em todos os índices compostos. Nunca permita que uma tabela com escopo de tenant exista sem esta coluna — umatenant_idausente é um vazamento de dados iminente.Configure o Row-Level Security (RLS) do PostgreSQL. Crie uma política em cada tabela com escopo de tenant que filtre linhas por
current_setting('app.current_tenant_id'). Isso funciona como uma rede de segurança em nível de banco de dados — mesmo que o código do aplicativo esqueça uma cláusula WHERE, o RLS bloqueia leituras entre tenants.Construa middleware ciente de tenant. No início de cada requisição, extraia o
tenant_idda sessão autenticada ou das declarações JWT. Defina-o na conexão do banco de dados usandoSET LOCAL app.current_tenant_id = '...'dentro de uma transação. Todas as consultas subsequentes nessa requisição herdarão o escopo do tenant automaticamente.Escopo de todas as consultas ORM por tenant. Se estiver usando Prisma, aplique um middleware global que injete
where: { tenantId }em cada chamadafindMany,findFirst,updateedelete. Se estiver usando Drizzle, crie um construtor de consulta base que inclua o filtro de tenant. Nunca confie que os desenvolvedores se lembrem de adicionar o filtro manualmente.Lide com migrações cientes de tenant. Cada migração de nova tabela deve incluir
tenant_idcomo uma coluna. Escreva uma regra de linting ou verificação de CI que rejeite qualquer migração que crie uma tabela semtenant_id, a menos que a tabela seja explicitamente marcada como global (por exemplo,plans,feature_flags).Construa rotas de administrador entre tenants separadamente. Endpoints de administrador que agregam dados entre tenants devem ignorar o RLS explicitamente usando
SET LOCAL role = 'admin_bypass'ou uma função de banco de dados dedicada. Essas rotas devem ser protegidas por um fluxo de autenticação de administrador separado — nunca reutilize sessões de usuário de tenant para acesso de administrador.Implemente o provisionamento de tenant. Quando um novo cliente se inscreve, crie seu registro de tenant, semeie dados padrão (funções, configurações, estado de onboarding) e atribua o usuário fundador. Envolva isso em uma transação de banco de dados para que o provisionamento parcial nunca deixe registros órfãos.
Exemplos
Exemplo 1: Política RLS do PostgreSQL para Isolamento de Tenant
-- Enable RLS on the table
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
ALTER TABLE projects FORCE ROW LEVEL SECURITY;
-- Policy: users can only see rows where tenant_id matches the session variable
CREATE POLICY tenant_isolation ON projects
USING (tenant_id = current_setting('app.current_tenant_id')::uuid);
-- Policy for INSERT: new rows must match the current tenant
CREATE POLICY tenant_insert ON projects
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.current_tenant_id')::uuid);
Exemplo 2: Middleware Express que Define o Contexto do Tenant por Requisição
import { Pool } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
async function tenantMiddleware(req, res, next) {
const tenantId = req.auth?.tenantId; // extraído do JWT durante a autenticação
if (!tenantId) return res.status(403).json({ error: "No tenant context" });
…
Perguntas frequentes
O que é um 'inquilino' (tenant)?
Um 'inquilino' é um cliente individual do seu aplicativo SaaS. Se você tem 100 clientes usando seu software, você tem 100 inquilinos.
Por que usar um banco de dados compartilhado?
É mais econômico e fácil de gerenciar do que ter um banco de dados separado para cada cliente, especialmente quando você tem muitos clientes.
O que é 'segurança em nível de linha' (RLS)?
É uma forma de segurança no banco de dados que garante que cada usuário ou cliente só possa ver ou modificar as linhas (registros) que lhe pertencem.
Detalhes
Descrição original do autor
Design and implement multi-tenant SaaS architectures with row-level security, tenant-scoped queries, shared-schema isolation, and safe cross-tenant admin patterns in PostgreSQL and TypeScript.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #4041
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
api-connector-builder
Faz seu agente construir novas conexões com APIs seguindo o padrão já existente. Use quando precisar adicionar mais uma integração sem criar um novo jeito de fazer.
affaan-m/ECC
api-design
Ajuda seu agente a projetar APIs REST seguindo as melhores práticas. É útil para definir como as APIs se comunicam, como os erros são mostrados e como organizar os dados.
affaan-m/ECC
backend-patterns
Ajuda seu agente com padrões de arquitetura do lado do servidor e otimização de banco de dados. É útil para construir ou revisar o código que roda no servidor.
affaan-m/ECC