Abbiamo un sistema globale che stiamo cercando di risolvere un problema di autorizzazioni in giro. Attualmente, il nostro sistema offre una serie di diverse applicazioni ai nostri clienti e ogni cliente ha il proprio elenco di tipi di utenti e utenti per il nostro sistema. Tuttavia, tutte queste cose possono essere indipendenti l'una dall'altra. Tale che il cliente A possa avere accesso all'applicazione A e all'applicazione B. Il client A potrebbe anche fornire diversi tipi di utente, tutti con utenti diversi. Ogni "livello" di utilizzo aggiungerebbe un nuovo livello di complessità al modo in cui diamo le autorizzazioni a tutto.
Ad esempio: potrei avere tre autorizzazioni, chiamate "Grape", "Purple" e "Car". A livello globale (ovvero tutte le applicazioni, i client, i tipi di utenti e gli utenti), rifiuto l'autorizzazione su Grape, ma concedo l'autorizzazione per Purple and Car. Ciò significa che nessuna applicazione, nessun client, nessun tipo di utente e nessun utente possono accedere a Grape, ma possono accedere a Purple e Car. Quindi ora abbiamo due applicazioni, denominate "Frutta" e "Auto". Attualmente, sia Fruit che Auto guardano in basso alle autorizzazioni globali create per Grape, Purple e Car e le usano. Quindi, ecco come appariranno le cose:
- Frutta
- Uva: negato
- Viola: concesso
- Auto: concesso
- Auto
- Uva: negato
- Viola: concesso
- Auto: concesso
Ma, per le applicazioni, questo potrebbe non avere senso. Quindi, vorrei creare un'autorizzazione specifica dell'applicazione per concedere le autorizzazioni per Grape e negare le autorizzazioni per Auto per l'applicazione di Fruit. Così ora, le autorizzazioni apparirebbero così.
- Frutta
- Uva: concesso (a)
- Viola: concesso
- Auto: negato (a)
- Auto
- Uva: negato
- Viola: concesso
- Auto: concesso
Mentre ho ancora i permessi globali che dicono ad Auto quali permessi usare, ho delle autorizzazioni specifiche che dicono a Fruit che ha bisogno di concedere e negare permessi diversi lì. Ora aggiungiamo un altro livello di complessità e aggiungiamo un client. Diciamo che ho un cliente chiamato "Fox". Fox utilizza entrambe le applicazioni Fruit and Car. In questo momento, senza aggiungere altro, le autorizzazioni ai tre oggetti (Grape, Purple e Car) provengono dal livello di autorizzazione dell'applicazione. Ma forse la Fox vuole cose diverse. Quindi, invece di avere Purple concesso sull'applicazione Fruit, nega specificatamente tale autorizzazione. In termini di dati, si tratterebbe di un record specifico da aggiungere solo per il client Fox che ignora le autorizzazioni di Purple a cui negare, indipendentemente da ciò che l'applicazione o le autorizzazioni globali hanno detto per Purple. Quindi, ora hai qualcosa che assomiglia a questo.
- Frutta
- Fox
- Uva: concesso (a)
- Viola: negato (c)
- Auto: negato (a)
- Fox
- Auto
- Fox
- Uva: negato
- Viola: concesso
- Auto: concesso
- Fox
Ricorda anche che molto di questo può essere abbastanza astratto. Potresti avere clienti che usano solo un'applicazione, tre applicazioni o ogni applicazione che hai nel tuo sistema. E per quei client, potresti avere elenchi di utenti molto specifici che possono utilizzare solo ciò che il client può utilizzare, in modo che possano ereditare le autorizzazioni dal client a meno che non siano specificatamente sovrascritti.
Ovviamente, questo può diventare sempre più complesso quando aggiungi un livello per il tipo di utente e poi per l'utente. Tenere traccia di tutto ciò può essere molto complicato, ma è qualcosa su cui dobbiamo tenere conto in base al modello del nostro sistema. Quindi, abbiamo trovato una soluzione di punteggio per le autorizzazioni.
Vorremmo interrogare il database e le tabelle e passare l'applicazione corrente, il client, il tipo di utente e l'utente al database per qualsiasi cosa abbiamo corrente al momento. Il database userebbe quindi una soluzione di punteggio per determinare se possiamo vedere o non vedere un permesso particolare. L'applicazione sarebbe un punteggio di 1, il cliente sarebbe un punteggio di 2, il tipo di utente sarebbe 4, l'utente sarebbe 8, ect. Più oggetti definiti inserisci, più alto può ottenere il punteggio massimo. Questo ci dà una definizione molto chiara di quali permessi sono attivi per un dato insieme di oggetti.
Il nostro vero problema ora sono le prestazioni. Ora abbiamo 5 livelli di oggetti nel nostro sistema e potremmo aggiungerne altri, se il design del sistema lo richiede. Tuttavia, l'esecuzione di query su tutti questi livelli rappresenta un grave risultato in termini di prestazioni su SQL. E ogni oggetto non farà che peggiorare esponenzialmente il problema. La mia domanda è questa: come posso ottenere lo stesso tipo di sistema di ereditarietà delle autorizzazioni qui, e dare la possibilità di aggiungere nuovi livelli quando necessario, senza aumentare in modo esponenziale il colpo sulle prestazioni. Devono esserci altre società e applicazioni che hanno questo stesso problema e che quindi hanno soluzioni migliori.