Vedi Pwas al lavoro: 30 minuti guidati su un'applicazione già funzionante. Prenota la demo →
Confronta i prodotti Pwas nel tuo settore Prenota una demo
Pwas-One
ERPShopCRMDoc ManagerAI Agent
Pwas.FrameworkPwas.ClientPwas.OrchestratorPwas.Microservice
Pwas CLIAssessmefyDynamic Registry Builder
Soluzioni Settori Documentazione Partner Richiedi una demo Inizia ora
Italiano English
pwas.it — powered by pooel.it
soluzioni · SaaS multi-tenant

L'isolamento tra tenant è una riga di config, non una riscrittura.

Permessi ownership-aware e visibilità per campo e per ruolo, risolti a runtime dallo stesso schema che descrive le tue entità — non un controllo scritto a mano in ogni endpoint.

il problema

Multi-tenancy scritta a mano è multi-tenancy fragile.

Ogni endpoint deve ricordarsi di filtrare per tenant, ogni nuova entità deve ripetere la stessa logica di ownership. Con Pwas.Framework le regole condizionali e la visibilità per ruolo sui singoli campi sono dichiarate una volta nello schema e valgono per ogni operazione, su ogni entità — comprese quelle che aggiungerete l'anno prossimo.

perché è il punto critico

L'incidente che ogni fondatore di SaaS teme, e perché è quasi sempre lo stesso.

La perdita di isolamento in un SaaS multi-tenant non avviene quasi mai per un attacco. Avviene perché qualcuno ha scritto un endpoint nuovo e non ha ripetuto il filtro. Un report aggiunto in fretta, un'esportazione, una funzione di ricerca globale scritta per il supporto interno e poi esposta. Il codice funziona perfettamente: fa esattamente quello che c'è scritto, e quello che c'è scritto è incompleto.

La ragione strutturale è che nell'approccio tradizionale l'isolamento è una convenzione che ogni pezzo di codice deve rispettare, non una proprietà del sistema. Ci si difende con revisioni del codice, test e disciplina. Sono difese utili e insufficienti: bastano una scadenza stretta e uno sviluppatore nuovo perché una di esse ceda. E il danno, quando accade, non è tecnico ma contrattuale e reputazionale.

Cosa cambia quando l'isolamento è dichiarato

Nel modello dichiarativo, la regola che un record appartiene a chi lo ha creato — o al tenant di chi lo ha creato — non è scritta in un endpoint: è una condizione dichiarata sull'entità. Il motore la applica a ogni lettura e a ogni scrittura, qualunque sia il percorso: schermata interna, interfaccia esposta, ricerca, esportazione, e anche un piano compilato da un agente AI.

La differenza pratica è netta. Non esiste un endpoint nuovo che possa dimenticare il filtro, perché il filtro non è nell'endpoint. Aggiungere un'entità l'anno prossimo significa dichiarare a chi appartiene, non ricordarsi di replicare una logica. Chi scrive una funzione nuova non deve conoscere le convenzioni del progetto per non fare danni.

La visibilità per campo, che è il livello successivo

L'isolamento fra tenant è il requisito ovvio. Quello che nella pratica costa di più è il livello sotto: dentro lo stesso tenant, chi vede quali campi. L'amministratore del cliente vede i costi, l'operatore no. Il referente commerciale vede l'anagrafica completa, il tecnico solo ciò che gli serve per l'intervento.

Nel modello dichiarativo questa è la stessa categoria di regola, espressa alla granularità del singolo campo, e vale in ogni punto in cui quel campo potrebbe apparire. È la ragione per cui i progetti che partono già con permessi articolati — tipici del B2B dove il vostro cliente ha a sua volta ruoli interni — arrivano in produzione molto più in fretta di quanto l'esperienza tradizionale suggerirebbe.

il confronto

Isolamento scritto a mano contro isolamento dichiarato.

Multi-tenancy applicativa tradizionale

Una convenzione che tutti devono ricordare

  • Ogni endpoint deve applicare il filtro per tenant, e può dimenticarsene.
  • Ogni nuova entità richiede di ripetere la stessa logica di ownership.
  • La visibilità per campo si implementa schermata per schermata.
  • Le esportazioni e i report sono il punto in cui il filtro salta più spesso.
  • La sicurezza dipende da revisioni, test e disciplina del team.
  • Un'interfaccia esposta a terzi richiede una revisione di sicurezza a sé.
Isolamento dichiarato in Pwas

Una proprietà del sistema, non una convenzione

  • La condizione di appartenenza è dichiarata sull'entità e applicata a ogni operazione.
  • Una nuova entità dichiara a chi appartiene: non c'è logica da replicare.
  • La visibilità è dichiarata per campo e per ruolo, valida ovunque quel campo appaia.
  • Esportazioni, ricerche e report passano dallo stesso motore di autorizzazione.
  • La sicurezza non dipende da chi scrive il prossimo pezzo di codice.
  • Esporre un'interfaccia significa dichiarare cosa può vedere, non riverificare tutto.
come si parte

Dal modello al primo tenant in produzione.

Il percorso è lo stesso che siate al primo cliente o ne abbiate già cento da migrare.

  1. 01

    Definiamo cos'è un tenant per voi

    Sembra ovvio e quasi mai lo è: un tenant è l'azienda cliente, una sua sede, un suo progetto? Possono esistere utenti che appartengono a più tenant? Esistono dati condivisi fra tenant? Le risposte determinano tutto il resto e vanno date all'inizio.

  2. 02

    Dichiariamo appartenenza e ruoli

    Per ogni entità, a chi appartiene e quali ruoli possono farci cosa. Per ogni campo sensibile, chi lo vede. È il documento che sostituisce le convenzioni non scritte del progetto.

  3. 03

    Costruiamo il nucleo funzionale

    Dalle dichiarazioni nascono API, permessi, validazione e schermate. In questa fase si lavora sul prodotto, non sull'infrastruttura di isolamento, perché quella è già data.

  4. 04

    Verifica esplicita dell'isolamento

    Prima della produzione si verifica sistematicamente che nessun percorso permetta a un tenant di vedere dati di un altro: letture, ricerche, esportazioni, interfacce esposte. Poiché il motore è uno solo, la verifica è esaustiva invece che campionaria.

  5. 05

    Onboarding e crescita

    Aggiungere un tenant è un'operazione di configurazione. Aggiungere una funzionalità non richiede di riverificare l'isolamento, perché la nuova entità eredita lo stesso meccanismo.

multi-tenant

Un prodotto solo, tenant isolati per dichiarazione.

Isolamento, ruoli e configurazione per tenant fanno parte del modello: aggiungere un cliente è una configurazione, non un nuovo deploy.

AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo5YjQ3YWNiZS1lM2UxLTRkMGYtYWUwMi1lYWY4NWIyM2NlZDMAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaIYOPrG0Bt0Wv2GfptjxVhoAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDpmZTU4ZWM5Zi1mNGRlLTQyYTAtODQ4NC0wYjQwYTc3OGQ4OGVscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNoOkPB2Jj1ajgsa9/KFdyvdQAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggFII4O9qVM4cYlhtW7C3sSKhXVu6lup58VL459q7h+pykZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaEvgUhaM6+ik8PKKNqnkI+kAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCAb5xl+lV4VPQuPs1NaIfU+2Gg+O1OLHDw1yNiBXet1t2RuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBjvZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjliNDdhY2JlLWUzZTEtNGQwZi1hZTAyLWVhZjg1YjIzY2VkMy9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOmJjYjNmMDQ4LWU5MTQtNDZmNi1hNTMzLThmYTNlNDA5ZmIwMXJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCAUgjg72pUzhxiWG1bsLexIqFdW7qW6nnxUvjn2ruH6nKJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFgg9HLT9L4cfw4pV1hT7wtwf6wKkFMNcNwIipeBZ52BlpeiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFgghrz+p+/TwtmUcDfYvXRitdR2bveLLgNfBjm9P6Qv3pB0Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQBA97mMBD1GWcM2cohxbeplPe6OOYQHfptnLRlVrLQnMu55799+cqKqW5UgW2X51O3+bYtXzLbxmZh+hSZvr3pk=One product, many tenants, isolated by declarationA single declared model serves every tenant. Isolation, roles and per-tenant configuration are part of the declaration, so onboarding a new customer is a configuration change rather than a new deployment.MULTI-TENANT BY DECLARATIONCUSTOMERSTenant ATenant BTenant CShared modelONE PRODUCTTenant isolationDECLARED, NOT PATCHEDPer-tenant configBRANDING · RULES · PLANSOnboardingMINUTES, NOT RELEASESRESULTSeparate dataShared upgradesUsage per tenant
le garanzie

Cosa è dichiarato e cosa non può rompersi.

Proprietà del motore, verificabili in demo.

1
punto in cui l'isolamento è definito

La condizione di appartenenza è dichiarata sull'entità: non esiste un secondo posto in cui qualcuno possa dimenticarla o contraddirla.

per campo
la granularità della visibilità

Non solo quali record, ma quali attributi di quel record ciascun ruolo può leggere o modificare — e vale in ogni punto in cui il campo appare.

ogni percorso
dove la regola si applica

Schermate, ricerche, esportazioni, interfacce esposte e piani compilati da agenti AI passano tutti dallo stesso motore di autorizzazione.

config
l'aggiunta di un tenant

L'onboarding di un nuovo cliente non richiede modifiche al codice né una verifica di sicurezza dedicata.

Queste sono proprietà della piattaforma, verificabili in demo. Non sostituiscono le verifiche di sicurezza che ogni prodotto SaaS deve comunque condurre, né gli adempimenti che vi competono come titolari del trattamento dei dati dei vostri clienti.

approfondimento

Le domande di chi sta costruendo un prodotto.

"Database condiviso o un database per tenant?"

È la prima decisione architetturale di ogni SaaS e non ha una risposta universale, ma ha dei criteri chiari.

Database condiviso con isolamento logico è la scelta giusta nella grande maggioranza dei casi B2B: costa meno in infrastruttura, rende banali gli aggiornamenti dello schema, permette di aggiungere un cliente in un'operazione di configurazione. Il suo unico punto debole storico è esattamente quello che il modello dichiarativo risolve — il rischio che un percorso dimentichi il filtro.

Un database per tenant ha senso quando esistono requisiti contrattuali o normativi espliciti di separazione fisica, quando i volumi di un singolo cliente sono tali da richiedere risorse dedicate, o quando dovete poter consegnare a un cliente i suoi dati in modo completamente isolato. Ha costi reali: aggiornamenti da propagare, onboarding più oneroso, complessità operativa che cresce linearmente con i clienti.

Poiché in Pwas l'isolamento logico è dichiarato e non scritto a mano, la scelta può essere presa per ragioni di business invece che per paura, e in configurazioni miste — la maggior parte dei clienti in condivisione, i pochi con requisiti particolari separati — la stessa descrizione del dominio serve entrambi gli scenari.

"I nostri clienti hanno ruoli interni diversi fra loro. Come si gestisce?"

È lo scenario B2B normale, ed è quello dove la differenza si sente di più. Il cliente A ha tre ruoli, il cliente B ne vuole cinque con nomi suoi, il cliente C vuole che un certo campo sia visibile solo a chi ha una certa responsabilità.

Nel modello tradizionale ogni variante di questo tipo è una richiesta di sviluppo, e dopo dieci clienti la gestione dei permessi è il pezzo più intricato del prodotto — quello che nessuno vuole toccare.

Nel modello dichiarativo i ruoli e le visibilità sono dati di configurazione, non codice. Questo permette una cosa che i prodotti SaaS raramente offrono: lasciare che sia il cliente a definire i propri ruoli, entro i limiti che avete stabilito, senza che questo richieda un intervento da parte vostra. Il vostro supporto smette di essere il collo di bottiglia per ogni richiesta di permessi.

Il limite da conoscere: più flessibilità date, più il vostro prodotto deve poter spiegare all'amministratore del cliente cosa sta configurando. La parte difficile non è più tecnica, diventa di progettazione dell'esperienza.

"Dobbiamo esporre delle API ai nostri clienti. Cambia qualcosa?"

Cambia in meglio, ed è uno dei benefici meno evidenti fino a che non ci si arriva.

Nell'approccio tradizionale l'interfaccia pubblica è un secondo prodotto: ha un proprio livello di autorizzazione, propri controlli, propria superficie di rischio, e va tenuta in sincronia con l'applicazione principale. È anche il punto in cui i problemi di isolamento si manifestano più spesso, perché è la parte più usata da chi non conosce le convenzioni interne.

Quando i permessi sono dichiarati sul dominio, l'interfaccia esposta non ha un proprio livello di autorizzazione: usa lo stesso. Un cliente che chiama con le proprie credenziali vede esattamente ciò che vedrebbe nell'applicazione, né più né meno. Esporre una nuova entità significa dichiarare che è esposta, non riprogettare i controlli.

Resta da progettare tutto il resto di un'interfaccia pubblica seria — limitazione del traffico, versionamento, documentazione, gestione delle chiavi — che sono problemi veri ma non sono problemi di isolamento.

"Stiamo già in produzione con un'architettura nostra. Ha senso cambiare?"

Dipende da dove vi fa male, e la risposta onesta spesso è no.

Se il vostro prodotto è stabile, i permessi non cambiano quasi mai e non state aggiungendo entità in continuazione, il beneficio non giustifica il lavoro. L'isolamento dichiarato dà valore proporzionalmente a quanto spesso il modello cambia.

Ha invece senso valutarlo in tre situazioni ricorrenti. Quando i permessi sono diventati il freno del prodotto: ogni richiesta di un cliente su chi vede cosa diventa sviluppo. Quando avete avuto un incidente di isolamento, o siete arrivati vicino, e sapete che le difese attuali sono procedurali. Quando state per aggiungere un canale — un'interfaccia pubblica, un portale, un agente AI — e vi rendete conto che replicare i controlli su quel canale è un progetto a sé.

Anche in questi casi l'approccio è incrementale: si porta nel modello dichiarativo un dominio alla volta, senza fermare il prodotto. Vale la stessa logica della modernizzazione applicativa, con la stessa raccomandazione di partire da un perimetro ristretto.

verifica rapida

È il vostro caso?

Probabilmente sì

  • State costruendo un prodotto SaaS B2B in cui i clienti hanno ruoli interni diversi.
  • I permessi sono diventati la parte più fragile e temuta del vostro prodotto.
  • Aggiungete entità e funzionalità con frequenza e ogni volta dovete ripetere i controlli.
  • Dovete esporre interfacce o portali ai clienti e la sicurezza vi preoccupa.
  • Avete clienti con requisiti di separazione dei dati più stringenti di altri.
  • Volete che siano i clienti a configurare i propri ruoli, senza passare dal vostro supporto.

Probabilmente no

  • Il vostro prodotto è stabile e il modello dei permessi non cambia da anni.
  • Avete un solo tipo di utente e nessuna necessità di visibilità differenziata.
  • Il vostro problema principale è la scalabilità infrastrutturale, non l'isolamento logico.
  • Cercate una soluzione di gestione identità e accessi da collegare a un prodotto esistente.
domande frequenti

SaaS multi-tenant: le domande specifiche.

Come si gestiscono i dati condivisi fra tenant?
Si dichiarano come tali. Un catalogo comune, una tabella di riferimento o una configurazione globale sono entità con una regola di appartenenza diversa: leggibili da tutti, modificabili solo da ruoli di piattaforma. Poiché la regola è esplicita, non c'è ambiguità su quali dati siano condivisi — che è esattamente la domanda che vi farà il primo cliente attento alla sicurezza.
Un utente può appartenere a più tenant?
Sì, ed è uno degli scenari che va definito all'inizio perché condiziona il modello. Tipicamente si tratta di consulenti o partner che operano su più clienti. La regola di appartenenza può prevedere che l'utente veda i dati dei tenant a cui è associato, con ruoli potenzialmente diversi per ciascuno. Va progettato consapevolmente: è anche il punto in cui una definizione sbagliata di tenant si paga di più.
Gestisce prodotti multilingua per tenant diversi?
Sì. Un campo può essere dichiarato come traducibile, e il motore gestisce automaticamente l'archiviazione delle varianti linguistiche, le letture con ricadute sulla lingua predefinita e gli aggiornamenti annidati in scrittura. Vale per tenant, il che significa che clienti in paesi diversi possono avere contenuti nelle proprie lingue senza che voi gestiate la cosa a mano.
Che impatto ha sulle performance un controllo così granulare?
Le condizioni di appartenenza e visibilità sono risolte a runtime e si traducono in filtri applicati alla fonte, non in filtraggi successivi in memoria: il costo è comparabile a quello di un filtro scritto a mano nella stessa query. Il dimensionamento si fa comunque sui vostri volumi reali durante il progetto, e le verifiche di carico precedono il passaggio in produzione.
Possiamo dare ai clienti un ambiente di prova?
Sì, ed è una configurazione comune: un tenant di prova con dati propri, isolato come qualsiasi altro. Poiché l'isolamento è la proprietà di base, un ambiente dimostrativo non richiede un'installazione separata a meno che non lo vogliate per altre ragioni, come evitare qualsiasi contatto con i dati di produzione.
Quanto tempo serve per un primo prodotto in produzione?
Per un perimetro funzionale ristretto ma reale — un insieme di entità, i ruoli, l'onboarding di un tenant — l'ordine di grandezza è di alcune settimane dalla definizione condivisa del modello. Il tempo si concentra sulla progettazione del prodotto, non sull'infrastruttura di isolamento, che è la parte che tradizionalmente ne consuma di più.

Stai lanciando un prodotto SaaS?

Ti mostriamo l'isolamento multi-tenant su un'applicazione funzionante, e come si comporta sui percorsi dove di solito si rompe.