Un unico dashboard pubblicato, sicurezza a livello di riga per singolo visualizzatore. Una singola tabella delle autorizzazioni gestisce l'accesso, consentendo a partner esterni e team interni di condividere in sicurezza lo stesso dashboard incorporato.
Integrare una dashboard AI/BI di Databricks in un'applicazione rivolta ai clienti è relativamente semplice: basta abilitare l'incorporamento, generare un token con ambito definito nel backend e visualizzare la dashboard con l'SDK client. La guida fondamentale, Come incorporare le dashboard AI/BI di Databricks nelle applicazioni rivolte ai clienti illustra questo processo dall'inizio alla fine.
La questione più complessa riguarda l'autorizzazione: una volta incorporata una dashboard, quali righe deve visualizzare ciascun utente? Un partner dovrebbe vedere solo i propri dati, mentre un team interno potrebbe vedere solo la propria area geografica. Questa guida mostra come applicare queste regole.
Questo modello di riferimento combina diverse funzionalità di Databricks: __aibi_external_value, i filtri di riga e le maschere di colonna di Unity Catalog e i gruppi sincronizzati da un provider di identità (IdP). Si tratta di un modello di progettazione, non di una singola funzionalità da abilitare.

La stessa tabella delle autorizzazioni gestisce due percorsi: le dashboard incorporate a cui si accede tramite l'applicazione e le query SQL dirette eseguite dagli utenti di Databricks.
Consideriamo un'azienda che utilizza una dashboard condivisa "Attività di contabilità clienti (AR) aperte" per i dati di tre aree geografiche: West, East e Central. La dashboard si rivolge a due tipi di pubblico.
Cinque utenti condividono lo stesso set di dati, ma ognuno ne vede una parte diversa: Acme Ops, Bolt Partners, Core Logistics, Finance e un team operativo locale. Gli esempi seguenti si concentrano su Acme e Finance; gli identificatori partner_acme, finance_all e West rappresentano questi esempi. Acme vede West con le e-mail mascherate, mentre Finance vede tutte e tre le aree geografiche per intero, entrambi a partire dalla stessa dashboard pubblicata.
Le regole di accesso risiedono in un unico punto, anziché essere sparse tra dashboard o query. Creare una dashboard per ciascun cliente genera copie che possono andare fuori sincrono, mentre ripetere i filtri in ogni query aumenta la possibilità di commettere errori.
Il modello è composto da tre oggetti:
| task_id | market | operating_partner | amount_open | contact_email |
|---|---|---|---|---|
| T-1001 | West | Acme Ops | $12,400 | jane@acme.com |
| T-1002 | East | Bolt Partners | $8,900 | raj@bolt.com |
| T-1003 | Central | Core Logistics | $15,200 | mia@core.com |
| viewer_scope | market | mask_pii |
|---|---|---|
| partner_acme | West | true |
| finance_all | West | false |
| finance_all | East | false |
| finance_all | Central | false |
| ops_west | West | false |
Nella maggior parte delle distribuzioni, questa tabella viene popolata da un sistema di autorizzazioni a monte o da una mappatura gruppo-area geografica di proprietà dell'applicazione; non viene modificata manualmente per ogni utente.
In questo modo si evita di avere dashboard specifiche per cliente e filtri ripetuti in tutte le query. Le regole risiedono in una tabella che può essere interrogata, controllata e modificata senza dover intervenire sulla dashboard.
Applicata per ciascun utente, la vista protetta restituisce solo i dati a cui l'utente ha diritto di accedere:
Acme (external_value = partner_acme): solo West, e-mail di contatto mascherata.
| task_id | market | operating_partner | amount_open | contact_email |
|---|---|---|---|---|
| T-1001 | West | Acme Ops | $12,400 | ****@acme.com |
Finance (external_value = finance_all): tutte e tre le aree geografiche, e-mail di contatto completa.
| task_id | market | operating_partner | amount_open | contact_email |
|---|---|---|---|---|
| T-1001 | West | Acme Ops | $12,400 | jane@acme.com |
| T-1002 | East | Bolt Partners | $8,900 | raj@bolt.com |
| T-1003 | Central | Core Logistics | $15,200 | mia@core.com |
Il backend imposta questo valore quando genera il token di incorporamento. Si autentica come service principal e richiede a Databricks un token con ambito definito contenente due valori: external_viewer_id, che identifica l'utente a scopo di controllo, ed external_value, che rappresenta l'ambito dell'utente. Databricks firma il token e l'utente non può modificare il valore incorporato, che viene esposto al codice SQL della dashboard come __aibi_external_value. Poiché contiene le credenziali del service principal, questo backend è un componente lato server attendibile, mai il browser, e tali credenziali vengono conservate in un gestore di segreti (secrets manager) anziché nel controllo del codice sorgente.
Il dettaglio fondamentale è l'identità con cui viene eseguita la query. Le query incorporate vengono eseguite con l'identità di pubblicazione configurata, non con l'identità Databricks dell'utente.
Per l'incorporamento esterno, Databricks consiglia di utilizzare autorizzazioni sui dati individuali e di concedere al service principal il proprio accesso ai dati, in modo che le query vengano eseguite come service principal. (La pubblicazione con autorizzazioni sui dati condivise esegue invece le query con le credenziali del pubblicatore). La vista limita quindi tale accesso per ciascun utente tramite __aibi_external_value. Poiché la query viene eseguita come service principal, is_account_group_member() non può identificare la persona reale che visualizza la dashboard nel percorso di incorporamento.
Il dettaglio importante è che external_value non è limitato a un ID partner. Può essere qualsiasi ambito che il backend inserisce con firma nel token, ad esempio partner_acme per un partner esterno o finance_all per un gruppo interno (il nome del loro gruppo).
Poiché la tabella delle autorizzazioni contiene gli ID dei partner e i nomi dei gruppi nella stessa colonna, un'unica dashboard, un'unica vista e un unico filtro coprono entrambi i casi.
Poiché l'utente non vede né imposta mai il valore firmato, non può modificarlo. Un ambito sconosciuto non corrisponde a nessuna riga, il che garantisce un comportamento di negazione predefinito (default-deny).
La stessa vista e lo stesso filtro (WHERE viewer_scope = __aibi_external_value) servono entrambi i tipi di pubblico. Cambia solo l'origine di tale ambito:
| Attributo | Partner esterno | Team interno |
|---|---|---|
| Accesso a Databricks | No; accede tramite il portale | Sì; accede tramite l'IdP |
| Cosa imposta l'ambito | ID partner fisso | Gruppo IdP autorizzato |
| Valore firmato come __aibi_external_value | partner_acme | finance_all |
| Autorizzazione corrispondente | Un'area geografica | Una o più aree geografiche autorizzate |
Le organizzazioni in genere gestiscono l'accesso tramite gruppi sincronizzati da un provider di identità. Quando qualcuno entra a far parte del gruppo Finance in Okta, il suo accesso viene mappato automaticamente su finance_all, senza dover modificare alcuna tabella di dati. In questo esempio, finance_all è mappato su tutte le aree geografiche e ops_west è mappato sull'area geografica West.
In che modo l'applicazione apprende a quali gruppi appartiene il visualizzatore? Non può fare affidamento su SQL durante l'incorporamento, perché la query viene eseguita come entità servizio e is_account_group_member() verificherebbe l'identità errata. L'applicazione deve risolvere i gruppi del visualizzatore nel backend, che può vedere il visualizzatore, prima di generare il token.
Un'opzione consiste nell'eseguire l'applicazione su Databricks Apps con l'autorizzazione utente abilitata.
Per un utente interno che ha effettuato l'accesso, la piattaforma inoltra il contesto di identità attendibile al backend, inclusi l'indirizzo e-mail del visualizzatore e un token on-behalf-of (OBO). Il backend utilizza tale token per chiamare SCIM /Me come visualizzatore e leggerne i gruppi.
Questo approccio non richiede diritti di amministratore sull'entità servizio, poiché l'utente sta leggendo il proprio record. Richiede ambiti di autorizzazione utente e Apps OBO è ancora in fase di sviluppo, quindi convalidalo rispetto alla distribuzione di destinazione prima di fare affidamento su di esso.
Se non viene trovato alcun gruppo autorizzato, blocca l'accesso per sicurezza e rifiuta di generare un token anziché ripiegare su un'identità più ampia come l'e-mail non elaborata.
Se un visualizzatore appartiene a più gruppi autorizzati, risolvi il risultato in modo deterministico. Definisci un ordine di precedenza o mappa diversi gruppi a un unico ambito canonico prima di generare il token, in modo che lo stesso visualizzatore riceva sempre un accesso coerente.
I partner esterni sono più semplici. Senza un'identità Databricks, il loro ambito è un ID partner fisso assegnato al momento dell'accesso. Stesso token, stesso filtro, nessuna ricerca.
Una limitazione da considerare nella progettazione: un token firmato contiene un singolo external_value. Se un visualizzatore appartiene a diversi gruppi con autorizzazioni differenti, un token può comunque rappresentare un solo ambito. Per il caso comune di un singolo ruolo per persona, questo va bene.
Per una vera unione multi-gruppo, utilizza un gruppo con accesso completo o il percorso SQL diretto descritto di seguito, in cui un filtro di riga può applicare l'operatore OR a tutti i gruppi. Un ambito composito (come JSON) può essere inserito in external_value, ma in tal caso l'analisi e la corrispondenza si spostano nel codice SQL del dataset e rimangono vincolate al limite di payload di 1 KB.
Il filtraggio delle righe fornisce il comportamento di base: ogni visualizzatore vede solo le proprie righe. Tre livelli aggiuntivi rafforzano i controlli, e tutti e tre leggono dalla stessa tabella delle autorizzazioni.
La sicurezza a livello di riga determina a quali righe può accedere un visualizzatore. Il mascheramento determina quali colonne può vedere, poich é i partner esterni di solito non hanno bisogno dello stesso livello di dettaglio dei team interni.
Il flag mask_pii, impostato su true per i partner e su false per i gruppi interni, guida la logica di mascheramento nella vista protetta (l'espressione CASE nel codice SQL sopra). La stessa dashboard può mostrare a un visualizzatore interno l'e-mail completa, mostrando invece a un partner un valore mascherato come ****@example.com. Quando le regole di mascheramento interessano molte tabelle e diventano complesse, le maschere di colonna di Unity Catalog e il controllo dell'accesso basato sugli attributi (ABAC) rappresentano la soluzione migliore a lungo termine; in questo caso, la vista mantiene l'esempio autonomo.
Un ambito sconosciuto non dovrebbe restituire alcuna riga della dashboard e non dovrebbe rivelare nulla sulla struttura dei dati sottostante: nessun errore che alluda alla struttura, nessun dato parziale, solo un risultato vuoto. Interrompere il processo in anticipo è ancora più pulito: prima che il backend generi un token, controlla la tabella delle autorizzazioni e rifiuta qualsiasi ambito che abbia diritto a zero righe. Altrettanto importante, l'ambito deriva dal visualizzatore autenticato, mai da un parametro fornito dal client, in modo che un visualizzatore non possa richiedere l'ambito di un altro tenant.
Il controllo in fase di emissione del token impedisce a un visualizzatore non autorizzato di ricevere un token, il che è preferibile rispetto all'affidarsi al filtro SQL come unica protezione. La registrazione sia dell'emissione corretta dei token sia delle richieste negate rende verificabili le decisioni di autorizzazione: il visualizzatore negato semplicemente non compare mai e, anche se una richiesta dovesse sfuggire, un ambito sconosciuto non restituirebbe comunque alcuna riga della dashboard. La registrazione di external_viewer_id e del relativo ambito in tali log consente di ricondurre ogni decisione di autorizzazione a un cliente o utente reale durante un audit.
I controlli di incorporamento proteggono il percorso dell'applicazione. Un utente Databricks che interroga direttamente la tabella di base rappresenta una minaccia separata. Aggiungi un filtro di riga di Unity Catalog alla tabella di base, associato all'identità e ai gruppi dell'utente che esegue la query. In questo percorso di query diretta, is_account_group_member() valuta l'utente effettivo e può combinare tutti i suoi gruppi autorizzati. L'eccezione del publisher nella funzione seguente (current_user() uguale all'identità di pubblicazione) è una concessione di emergenza deliberata per l'identità che pubblica o aggiorna la dashboard, non un bypass generale per l'operatore. È opzionale e ad alto rischio, quindi includila solo se giustificata e approvala per ogni distribuzione.
Una maschera di colonna per i campi sensibili funziona allo stesso modo. Questi controlli di Unity Catalog sono separati dal percorso di incorporamento: i visualizzatori incorporati sono limitati tramite __aibi_external_value e la vista delle autorizzazioni, mentre le query dirette dell'area di lavoro sono protette dal filtro di riga di Unity Catalog, che valuta l'identità e i gruppi del chiamante. Entrambi i punti di applicazione utilizzano la stessa tabella delle autorizzazioni.
Informazioni sulla "multi-tenancy". Si tratta di una multi-tenancy logica e condivisa: i partner esterni sono isolati gli uni dagli altri, mentre i dipendenti interni ricevono un accesso basato sui gruppi (basato sui ruoli) all'interno del tenant dell'azienda. Tutti i dati rimangono in tabelle condivise; il token, il filtro della vista e la tabella delle autorizzazioni impongono la separazione. Il filtro di riga SQL diretto estende la stessa garanzia all'esterno dell'app.
Quando utilizzare questo pattern. Utilizza questo pattern quando i partner esterni senza account Databricks e i dipendenti interni devono condividere la stessa dashboard. Se ogni visualizzatore è un utente Databricks interno, l'incorporamento di base con la sicurezza a livello di riga e colonna di Unity Catalog potrebbe essere sufficiente.
Vincoli pratici e aspetti da considerare. Verifica i seguenti limiti del prodotto e dettagli operativi rispetto alla documentazione corrente prima della pubblicazione:
Inizia con la guida fondamentale, Come incorporare i dashboard Databricks AI/BI nelle applicazioni rivolte ai clienti, quindi applica i pattern di autorizzazione, mascheramento e rifiuto predefinito descritti in questo post. Per i controlli di governance sottostanti, consulta la documentazione sull'incorporamento di AI/BI, oltre ai filtri di riga e alle maschere di colonna di Unity Catalog e alla guida ad ABAC.
(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale
Iscriviti al nostro blog e ricevi gli ultimi articoli direttamente nella tua casella di posta.