Per limitazione utente, si intende la possibilità per un sotto insieme di utenti, che accedono ad una applicazione cliente, di essere identificati come utenti limitati ovvero che possono visualizzare un certo numero di informazioni ristrette all’interno del modello e quindi non aver accesso completo all’istanza dell’applicazione.
Come accennato nella definizione del "Multidimensional Data Model", in una applicazione cliente, di solito sono coinvolti pochi utenti “amministratori”, ovvero utenti che non hanno particolari vincoli di accesso, e molti utenti “collaboratori” con la presenza di diversi livelli di limitazione di accesso e visualizzazione dei dati.
In generale, tutte le soluzioni di Analysis Services, possono essere protette mediante le autorizzazioni applicate sui ruoli in Analysis Services:
• Modelli multidimensionali, possono utilizzare la sicurezza a livello di cella e di dimensione;
• Modelli Tabulari, possono utilizzare la sicurezza a livello di riga. Il concetto di limitazione utente, già implementato nella struttura multidimensionale, deve essere opportunatamente inserito anche nella
modellazione di tipo tabulare utilizzando la sicurezza dinamica a livello di riga. Ciò significa che è possibile applicare una limitazione sulle singole righe di una tabella dimensionale, appartenente al modello, mediante la gestione dei ruoli in modalità tabulare.
A causa degli approcci implementativi differenti delle due modellazioni è utile definire dei flussi di ETL specifici per l’applicazione della limitazione utente.
Questa fase risulta essere abbastanza importante, poiché il malfunzionamento comporterebbe l’accesso a dati sensibili da parte degli utenti non autorizzati con annessi problemi relativi al codice della privacy.
Partendo dal concetto di limitazione, un utente può presentare un accesso completo o limitato per alcuni importi per specifici conti, entità aziendali, scenari etc… Generalizzando, quindi, possiamo dire che è opportuno intervenire sull’architettura del modello in particolare sulle dimensioni.
I ruoli, nei modelli tabulari, definiscono i permessi di lettura e amministrazione dei membri ovvero degli utenti per una istanza applicativa, riconoscibili tramite autenticazione di windows. Per la gestione di tale permessi, saranno utilizzati i permessi di lettura con sicurezza a livello di riga con opportuni filtri su riga (Row Filter).
6.5.2 IMPLEMENTAZIONE DELLA SOLUZIONE
In questa parte sono illustrati i passaggi salienti per l’implementazione risolutiva della sicurezza a livello di riga in SSAS Tabulare.
Bisogna intervenire sulle tabelle dimensionali del modello, quindi, è necessario seguire tre step operazionali per ogni dimensione da limitare:
1. Creare una tabella, utilizzata per la limitazione utente, definita
UTENTE_LIM seguito dal nome relativo della tabella dimensionale che si sta gestendo (per esempio per la dimensione conto
UTENTE_LIM_CONTO)
2. Recuperare e caricare tutti gli utenti aventi accesso completo o parziale con relative righe di accesso, relative alla dimensione che si sta gestendo, all’interno della tabella creata precedentemente.
3. Gestire i ruoli e le autorizzazioni di accesso a livello di riga sulla tabella mediante la gestione dei ruoli in Analysis Service.
In questo modo, determineremo per ogni applicazione realizzata nel modello una limitazione di accesso utente sugli importi relativi a specifici scenari, tipi di conti, entità aziendali, categorie o/e dimensioni personalizzate (se instanziate). In un esempio di istanza, dopo aver verificato, tramite autenticazione di
windows, che un utente è limitato sotto determinate dimensioni, in modo del tutto automatico saranno filtrate tutte e sole le righe delle rispettive tabelle “Utente_Lim” relative alle dimensioni del modello, per la quale l’utente non ha accesso, determinando una esplorazione filtrata, limitata e corretta degli
oggetti presenti nell’applicazione cliente.
In particolare, per ogni tabella dimensionale, stabiliremo se un utente è:
• Non Limitato - restituendo l'accesso completo per tutte le righe della relativa tabella dimensionale
• Limitato - restituendo l’accesso parziale ad un sotto insieme di righe della relativa tabella dimensionale
La Tabella 5.8 e la Tabella 5.9, distinte per livello di visibilità dei dati, rappresentano le informazioni di limitazione degli utenti utilizzate come sorgente relazionale in fase di data entry all’interno del "Multidimensional Data Model". Per ogni dimensione, queste saranno utilizzate in progettazione tabulare per recuperare le informazioni degli utenti per la gestione della
limitazione. Si distinguono due livelli di visibilità, un primo livello definito “generico”, relativa alla tabella 5.8 rinominata “Utente”, che identifica esclusivamente se un utente ha accesso completo o parziale ad un sotto insieme di dimensioni, ed un secondo livello definito “dettagliato”, rappresentato da singole tabelle distinte per ogni dimensione da limitare rinominate dal prefisso “Lim_” seguito dal nome relativo della dimensione a cui viene applicata la limitazione utente (ad esempio la tabella “Lim_Scenario” relativa alla dimensione “Scenario” rappresentata in Tabella 5.9), che permette di identificare univocamente le sole righe di accesso di un utente limitato per
Tabella 5.8: Rappresenta la Tabella “Utente” contenente informazioni di visibilità di primo livello, per ogni utente abilitato appartenente ad una istanza applicativa.
Tabella 5.9: Rappresenta la Tabella “Lim_Scenario” relativa alla dimensione “Scenario” contenente informazioni di visibilità di secondo livello, per ogni utente limitato
appartenente ad una istanza applicativa.
COLONNA TIPO DESCRIZIONE
COD_UTENTE varchar(255) Codice utente DESC_UTENTE varchar(1000) Descrizione utente
LIM_AZIENDA varchar(2)
Specifica se esistono limitazioni per la dimensione entità gestibili dall'utente. I valori possibili sono:
• “X” tutti gli elementi della dimensione entità presenti nella tabella sono gestibili dall'utente.
• Diverso dal carattere ‘X’ allora gli elementi della dimensione entità gestibili dall'utente sono limitati.
LIM_CONTO varchar(2)
Specifica se esistono limitazioni per la dimensione conto gestibili dall'utente. I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione conto
LIM_SCENARIO varchar(2)
Specifica se esistono limitazioni per la dimensione scenario gestibili dall'utente.
I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione scenario.
LIM_CATEGORIA varchar(2)
Specifica se esistono limitazioni per la dimensione categoria gestibili dall'utente.
I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione categoria LIM_DEST1 varchar(2)
Specifica se esistono limitazioni per la dimensione personalizzabile dest1 (se utilizzata) gestibili dall'utente. I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione personalizzabile dest1.
LIM_DEST2 varchar(2)
Specifica se esistono limitazioni per la dimensione personalizzabile dest2 (se utilizzata) gestibili dall'utente. I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione personalizzabile dest2.
LIM_DEST3 varchar(2)
Specifica se esistono limitazioni per la dimensione personalizzabile dest3 (se utilizzata) gestibili dall'utente. I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione personalizzabile dest3.
LIM_DEST4 varchar(2)
Specifica se esistono limitazioni per la dimensione personalizzabile dest4 (se utilizzata) gestibili dall'utente. I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione personalizzabile dest4.
LIM_DEST5 varchar(2)
Specifica se esistono limitazioni per la dimensione personalizzabile dest5(se utilizzata) gestibili dall'utente. I valori possibili sono “X” e diverso dal carattere “X” descritti come dall’attributo LIM_AZIENDA per la dimensione personalizzabile dest5.
COLONNA TIPO DESCRIZIONE PK DIMENSIONE
COD_UTENTE varchar(255) Codice Utente Si UTENTE COD_SCENARIO varchar(15) Codice Scenario Si SCENARIO
FLAG_SOLO_VISUALIZZA numeric(1)
FLAG_SOLO_VISUALIZZAZIONE possibili valori:
• l’elemento non è editabile ma visualizzabile dall’utente
• ’elemento editabile e visualizzabile dall’utente
Riepilogando, per ogni dimensione da gestire per la limitazione utente è utile recuperare tutte le informazioni degli utenti non limitati e limitati e, per questi ultimi, le relative righe di accesso consentite ovvero tutti gli elementi visibili dell’utente per ogni dimensione.
Tali informazioni saranno importate all’interno del modello, per ogni dimensione, in singole tabelle distinte rinominate dal prefisso “utente_lim” seguito dal nome della relativa dimensione (esempio “utente_lim_conto” per la dimensione “conto”).
Per far ciò, è stato opportuno creare due flussi ETL distinti.
Nel primo flusso sono recuperati tutti gli utenti che presentano una
limitazione di accesso nel modello e memorizzati in una tabella ausiliara A, mentre nel secondo flusso, sono recuperati tutti gli utenti che non presentano alcuna limitazione, memorizzati in una tabella ausiliara B.
Per ogni dimensione saranno memorizzate:
1. Nel primo flusso le relative righe di accesso consentite di ogni utente limitato
2. Nel secondo flusso, tutte le righe di accesso della dimensione per utenti che non presentano alcuna limitazione di accesso (avente accesso completo alla dimensione).
Per poter determinare, nel secondo flusso, tutte le righe accessibile di una tabella dimensionale per tutti gli utenti senza limitazioni, è utile creare un prodotto cartesiano tra:
• La tabella “Utente” filtrata per utenti non limitati sul campo “Cod_Utente”; • La tabella dimensionale sul relativo campo “Primary Key”.
Per i nostri scopi, poiché non importa dover gestire separatamente la
limitazione di accesso per tabelle separate all’interno del progetto, è possibile concludere con un flusso finale che è determinato dall’unione delle due tabelle
tabella dimensionale, utile per la gestione della limitazione utente, costituita da tutte le righe accessibili di ogni utente (limitato e non).
Tale procedura, come detto precedente, sarà effettuata per ogni dimensione da limitare all’interno del modello.
Una volta importate tutte le tabelle di limitazione utente nel progetto tabulare, è necessario definire le relazioni, presenti in Tabella 6.0, con le rispettive tabelle dimensionali. Successivamente, è possibile proseguire con il punto finale ovvero l’applicazione della limitazione utente tramite ruoli in Analysis Service.
Tabella 6.0: Relazione tra tabelle dimensionali e relative tabelle per la gestione della limitazione utente
TABELLA[COLONNA] RELAZIONE TABELLA[COLONNA]
UTENTE_LIM_AZIENDA [COD_AZIENDA] N a 1 AZIENDA[COD_AZIENDA] UTENTE_LIM_CONTO[COD_CONTO] N a 1 CONTO[COD_CONTO] UTENTE_LIM_SCENARIO [COD_SCENARIO] N a 1 SCENARIO[COD_SCENARIO] UTENTE_LIM_CATEGORIA [COD_CATEGORIA] N a 1 CATEGORIA[COD_CATEGORIA] UTENTE_LIM_DEST1[COD_DEST1] N a 1 DEST1[COD_DEST1] UTENTE_LIM_DEST2[COD_DEST2] N a 1 DEST2[COD_DEST2] UTENTE_LIM_DEST3[COD_DEST3] N a 1 DEST3[COD_DEST3] UTENTE_LIM_DEST4[COD_DEST4] N a 1 DEST4[COD_DEST4] UTENTE_LIM_DEST5[COD_DEST5] N a 1 DEST5[COD_DEST5]
Figura 6.1: Relazione tra tabelle dimensionali e relative tabelle per la gestione della limitazione utente in SSAS Tabular.
In Figura 6.1, sono riportate tre tabelle dimensionali (Categoria, prima
dimensione personalizzata ed Entità) e le relative relazioni con le corrispettive tabelle utilizzate per la gestione della limitazione utente definite
precedentemente.
A questo punto è necessario definire un ruolo nel modello tabulare per qualsiasi utente, denominato “User_Lim” di sola lettura a cui vengono applicati dei “row filter” utilizzati per il filtraggio a livello di riga sulle tabelle relative alla gestione della limitazione utente (utente_lim seguito dal nome della dimensione). Nello specifico, l’utente potrà esplorare i soli dati specificati dai “row filter” associati al ruolo. Ogni row filter, applicato sulle tabelle per la limitazione utente, è espresso mediante uno script in linguaggio DAX con le funzioni “Username()” e “LookUpValue()” che permettono di verificare se l’utente loggato al modello appartiene alla lista degli utenti presenti nella tabella “Utente”; e se il controllo restituisce valore positivo, vengono recuperate le sole righe accessibili dall’utente delle rispettive dimensioni,
altrimenti non saranno restituite righe dal sistema e di conseguenza tale utente non avrà accesso all'applicazione.
Il risultato finale, durante l’esecuzione di una istanza da parte di un utente limitato, sarà l’esecuzione innescata dei row filter presenti dal ruolo
“User_Lim” sulle tabelle utilizzate per la limitazione utente e successivamente, per logica di “propagazione di filtro”, saranno filtrate le corrispettive
dimensioni sottostanti e infine la tabella dei fatti, mentre per l’esecuzione dell’istanza da parte di un utente non limitato i “Row-Filter” non avranno alcun effetto. Il seguente Script in DAX rappresenta il Row-Filter applicato al ruolo “User_Lim” per la gestione della limitazione utente della tabella
“utente_lim_conto” per la dimensione “conto”.
= CONTO[COD_CONTO] = LOOKUPVALUE ( UTENTE_LIM_CONTO[COD_CONTO];
UTENTE_LIM_CONTO[COD_UTENTE]; USERNAME(); UTENTE_LIM_CONTO[COD_CONTO]; CONTO[COD_CONTO] )
6.6 GESTIONE DELLA VALUTA