Un SaaS con un inquilino por cliente

TeselaDB

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

Shell
teseladb admin --node node-01:27200 tenant create acme
teseladb admin --node node-01:27200 tenant create globex

2. 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:

JavaScript
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:

Shell
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:

JavaScript
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:

Shell
teseladb admin --node node-01:27200 tenant drop acme
teseladb admin --node node-01:27200 tenant drop globex

Siguientes pasos