MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Spring-data-mongodb mandantenfähig machen

Hier gibt es einige Möglichkeiten, die Katze zu häuten. Es läuft im Wesentlichen alles darauf hinaus, auf welcher Ebene Sie das Mietverhältnis anwenden möchten.

Grundlagen

Der grundlegende Ansatz besteht darin, eine Art Schlüssel zu binden, der den Kunden pro Thread identifiziert, sodass Sie den Kunden herausfinden können, mit dem sich der aktuelle Ausführungsthread befasst. Dies wird normalerweise durch Auffüllen eines ThreadLocal erreicht mit einigen Informationen zur Authentifizierung, da Sie den Mandanten normalerweise vom angemeldeten Benutzer ableiten können.

Nun, wenn das vorhanden ist, gibt es ein paar Möglichkeiten, wo das Mieterwissen angewendet werden kann. Lassen Sie mich kurz die gebräuchlichsten skizzieren:

Mandantenfähigkeit auf Datenbankebene

Eine Möglichkeit, Daten für mehrere Clients zu trennen, besteht darin, einzelne Datenbanken pro Mandant zu haben. Die zentrale Abstraktion von Spring Data MongoDB dafür ist die MongoDBFactory Schnittstelle. Der einfachste Weg hier ist, SimpleMongoDbFactory.getDb(String name) zu überschreiben und rufen Sie die übergeordnete Methode mit dem Datenbanknamen auf, z. angereichert mit dem Mandantenpräfix o.ä.

Mandantenfähigkeit auf Sammlungsebene

Eine weitere Option sind mandantenspezifische Sammlungen, z. durch Mieter Prä- oder Postfixes. Dieser Mechanismus kann tatsächlich genutzt werden, indem die Spring Expression Language (SpEl) im @Document verwendet wird collectionName der Anmerkung Attribut. Stellen Sie zuerst das Mandantenpräfix über eine Spring-Bean bereit:

 @Component("tenantProvider")
 public class TenantProvider {

   public String getTenantId() {
     // … implement ThreadLocal lookup here
   }
 }

Verwenden Sie dann SpEL in Ihren Domänentypen @Document Zuordnung:

 @Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
 public class Account { … }

Mit SpEl können Sie Spring Beans namentlich referenzieren und Methoden darauf ausführen. MongoTemplate (und damit transitiv die Repository-Abstraktion) verwendet die Mapping-Metadaten der Dokumentenklasse und das Mapping-Subsystem wertet den collectionName aus -Attribut, um mehr über die Sammlung zu erfahren, mit der interagiert werden soll.