Multitenant
Definizione
Un tenant è un gruppo omogeneo di utenti di una applicazione. In ambito SaaS un tenant è un "abbonato" al servizio che si fornisce o un cliente della applicazione.
Con multi-tenant si intende una architettura che consente a più tenant di utilizzare la stessa istanza fisica ma mantenendo una separazione delle istanze logiche della stessa applicazione.
Abbiamo la nostra applicazione distribuita in cloud e gli utenti:
Ognuno potrà vedere solo i suoi dati. La stessa cosa se gli utenti sono raggruppati in organizzazioni: ognuno potrà vedere solo i dati della propria organizzazione:
Architettura
Dal punto di vista tecnico deve succedere che la stessa
istanza dell'applicazione deve gestire le utenze mantenendo una separazione
logica degli utenti e una separazione fisica dei dati per implementare il
massimo livello di separazione fra i tenant: un database per tenant.
Quindi anche se i tenant condividono le stesse risorse che possono essere la VM o i dischi per i dati, conservano una separazione logica.
Soluzione proposta
Vediamo una applicazione multitenant dal
punto di vista della gestione degli utenti e del flusso del processo di
gestione di un sistema multitenant.
In una
applicazione multitenant gli utenti vanno gestiti nel contesto dello specifico
tenant di appartenenza.
Le fasi
di autenticazione e autorizzazione devono essere gestiti nello specifico tenant.
Prerequisiti
Chiariamo
due prerequisiti di base con l’obiettivo di ottenere una separazione forte fra
i dati dei vari tenant.
Prerequisiti
Chiariamo
due prerequisiti di base con l’obiettivo di ottenere una separazione forte fra
i dati dei vari tenant.
Autenticazione
- Gli utenti accedono tutti dallo stesso endpoint.- Gli utenti accedono specificando le loro credenziali e l'organizzazione di appartenenza (pippo@azienda1.it).
- Gli utenti della stessa organizzazione fanno parte dello stesso tenant
- Quando un utente fa l'accesso l'applicazione conosce a quale tenant questo appartiene.
Autorizzazione
- Quando si autorizza l'utente ad una operazione (visualizzare i record di una tabella) l'app deve tenere in considerazione il tenant dell'utente.- I ruoli utente come "Amministratore" o "Utente" devono essere gestiti dal cliente e non dal fornitore del SaaS.
- I ruoli devono essere consistenti nel tenant di appartenenza dell'utente, al di fuori di questo non devono esistere.
Le richieste, all’interno dell’intero ecosistema applicativo, devono
seguire il seguente flusso:
-
Accettare la connessione in arrivo e autenticare l’utente se necessario
-
Intercettare le richieste e identificare il
tenant di appartenenza dell’utente che ha fatto la richiesta
-
Stabilire una connessione con lo schema o il
database collelato al tenant.
L’identificazione del tenant di apparteneza è ottenuto mediante
l’uso di uno schema di default che contiene l’informazione che lega l’utente al
tenant. Un utente può essere autenticato da un servizio esterno che passa le
informazioni sul tenant usando l’http header.
Per fare
questo si può definire un header http personalizzato “X-TenantID” che identifica il tenant di appartenenza.
Identificare il tenant
Dobbiamo
determinare a quale tenant si riferiscono le richieste. Usando Spring Interceptor per intercettare le
richieste http e prendere dall’header l’informazione sul tenant. Il tenantID
così ricavato viene conservato in una variabile ThreadLocal che viene svuotata dopo il completamento della richiesta.
L’interceptor
ottiene il valore dell’header http “X-TenantID” per ogni richiesta e setta il
tenant corrente nella classe “TenantContext”.
Se non c’è l’header sul tenant viene restituito un errore.
Connessione al database
Una volta che
si è identificato il tenant di appartenenza della request bisogna reindirizzare
questa su una specifica connessione di database.
Viene usata una
tabella “DataSourceConfig” nello schema
pubblico per contenere il legame fra tenant e connessione al database di competenza.
Quest'opera è distribuita con Licenza Creative Commons Attribuzione 4.0 Internazionale (CC BY 4.0) - Condividi allo stesso modo
Commenti
Posta un commento