Hay bastantes formas de despellejar al gato aquí. Esencialmente, todo se reduce a en qué nivel le gustaría aplicar la tenencia.
Conceptos básicos
El enfoque básico es vincular algún tipo de clave que identifique al cliente por hilo, de modo que pueda averiguar sobre el cliente con el que trata el hilo de ejecución actual. Esto generalmente se logra completando un ThreadLocal
con cierta información relacionada con la autenticación, ya que normalmente puede derivar el arrendatario del usuario que inició sesión.
Ahora, si eso está en su lugar, hay algunas opciones de dónde aplicar el conocimiento del arrendatario. Permítanme resumir brevemente los más comunes:
Multiusuario a nivel de base de datos
Una forma de separar los datos de varios clientes es tener bases de datos individuales por arrendatario. La abstracción central de Spring Data MongoDB para esto es MongoDBFactory
interfaz. La forma más fácil aquí es anular SimpleMongoDbFactory.getDb(String name)
y llame al método principal con el nombre de la base de datos, p. enriquecido por el prefijo de arrendatario o similar.
Multiusuario en el nivel de colección
Otra opción es tener colecciones específicas de inquilinos, p. a través de prefijos o sufijos de arrendatario. Este mecanismo en realidad se puede aprovechar usando el lenguaje Spring Expression (SpEl) en el @Document
collectionName
de la anotación atributo. Primero, exponga el prefijo del arrendatario a través de un bean Spring:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Luego use SpEL en sus tipos de dominio @Document
asignación:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl le permite referirse a Spring beans por su nombre y ejecutar métodos en ellos. MongoTemplate
(y, por lo tanto, la abstracción del repositorio de forma transitiva) utilizará los metadatos de mapeo de la clase de documento y el subsistema de mapeo evaluará el collectionName
atributo para conocer la colección con la que interactuar.