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.