Un SaaS con un inquilino por cliente
TeselaDB
Equipo de TeselaDB
30 minAvanzado
Separa a cada cliente en su inquilino del mismo clúster, con sus usuarios y sus bases, sin que ninguno vea a los demás.
Un SaaS con muchos clientes pequeños no necesita un clúster por cliente, porque en TeselaDB cada cliente puede ser un inquilino del mismo clúster. Cada usuario pertenece a un inquilino. La autenticación fija el inquilino de la conexión a partir de su usuario y la autorización impide entrar en las bases de otro.
Lo que vas a construir
Dos inquilinos, acme y globex, cada uno con un usuario para su aplicación y su propia base tienda. Los dos usan el
mismo nombre de base y cada aplicación solo ve las bases de su inquilino.
Requisitos
- Un clúster de TeselaDB con usuarios y acceso a
teseladb admin. - Un usuario del inquilino 0 con permiso para crear usuarios, como
root.
1. Crea los inquilinos
teseladb admin --node node-01:27200 tenant create acme
teseladb admin --node node-01:27200 tenant create globex2. Crea un usuario en cada inquilino
Desde una conexión del inquilino 0, el argumento $tenant hace que el comando trabaje en otro inquilino. El nombre de
usuario es único en todo el clúster, así que cada inquilino lleva el suyo:
for (const tenant of ["acme", "globex"]) {
db.getSiblingDB("admin").runCommand({
createUser: `${tenant}-api`,
pwd: passwordPrompt(),
roles: [{ role: "readWrite", db: "tienda" }],
$tenant: tenant,
});
}3. Conecta cada aplicación con su usuario
La aplicación de cada cliente usa la cadena con su usuario. El inquilino sale de la autenticación:
export TESELADB_URI="mongodb://acme-api:<contraseña>@node-01:27017,node-02:27017/tienda?tls=true&tlsCAFile=./ca.pem"Probarlo
Conectado como acme-api con la cadena del paso 3, escribe un pedido en la colección pedidos de tienda y después
lista las bases del clúster para ver a cuáles de ellas llega la aplicación del cliente
acme:
db.pedidos.insertOne({ cliente: "Ana", total: 30 });
db.adminCommand({ listDatabases: 1, nameOnly: true });listDatabases muestra solo tienda, la de acme. Conectado como globex-api, la colección pedidos de su base
tienda está vacía, y sobre el clúster solo tiene listDatabases, bypassDefaultMaxTimeMS y useUUID.
Limpiar
Borra las bases y los usuarios de cada inquilino desde el inquilino 0 y después los inquilinos. tenant drop falla
mientras al inquilino le quedan bases o usuarios:
teseladb admin --node node-01:27200 tenant drop acme
teseladb admin --node node-01:27200 tenant drop globexSiguientes pasos
- Varios inquilinos en un clúster, con los pasos para un solo inquilino.
- Usuarios y roles, para dar a cada usuario solo lo que necesita.