Det finns en hel del sätt att flå katten här. Det handlar i princip om på vilken nivå du vill tillämpa hyresrätten.
Grunderna
Det grundläggande tillvägagångssättet är att binda någon form av nyckel som identifierar kunden per tråd, så att du kan ta reda på om kunden den aktuella utförandetråden handlar om. Detta uppnås vanligtvis genom att fylla i en ThreadLocal
med viss autentiseringsrelaterad information eftersom du vanligtvis kan härleda hyresgästen från den inloggade användaren.
Om det nu är på plats finns det några alternativ för var du ska tillämpa hyresgästkunskapen. Låt mig kort beskriva de vanligaste:
Flerhyresrätt på databasnivå
Ett sätt att separera data för flera klienter är att ha individuella databaser per hyresgäst. Spring Data MongoDB:s kärnabstraktion för detta är MongoDBFactory
gränssnitt. Det enklaste sättet här är att åsidosätta SimpleMongoDbFactory.getDb(String name)
och anropa den överordnade metoden med databasnamnet t.ex. berikad av hyresgästprefixet eller liknande.
Flerhyresrätt på samlingsnivå
Ett annat alternativ är att ha hyresgästspecifika samlingar, t.ex. genom hyresgästför- eller efterfix. Denna mekanism kan faktiskt utnyttjas genom att använda språket Spring Expression (SpEl) i @Document
annotations collectionName
attribut. Exponera först hyresgästens prefix genom en springböna:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Använd sedan SpEL i dina domäntyper @Document
kartläggning:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl låter dig referera till vårbönor med namn och utföra metoder på dem. MongoTemplate
(och därmed arkivabstraktionen transitivt) kommer att använda mappningsmetadata för dokumentklassen och mappningsundersystemet kommer att utvärdera collectionName
attribut för att ta reda på om samlingen att interagera med.