Progettazione di un sistema basato sui ruoli con più granularità

3

Sto progettando un sistema di richiesta di risorse in cui un utente può richiedere risorse di tipi diversi. Ci possono essere molti tipi di risorse come:

  1. VM
  2. DB
  3. File System
  4. etc

I tipi sopra possono avere sottotipi e cioè ci possono essere mysql , postgresql ecc per il tipo di risorsa di DB . L'utente può avere diversi ruoli come:

  1. Direttore
  2. Manager
  3. dipendenti

Use Cases

Un direttore può richiedere qualsiasi risorsa per conto di qualsiasi gestore e il suo centro di costo.

Un manager può richiedere qualsiasi risorsa per conto di qualsiasi dei suoi centri di costo.

Un dipendente può richiedere solo le risorse consentite dal suo manager.

Implementazione:

Per il direttore è molto semplice poiché non vi è alcun controllo nel sistema. Per manager e utente ho una relazione molti a molti tra resource type e user entità

Domanda:

Vedo che il sistema ha bisogno di Roles e Permissions ma usando questi posso stabilire alcune regole generiche come l'utente assegnato al ruolo Reporting può vedere i report, ma come gestire un livello più granulare di permessi come un dato utente può richiedere solo una determinata risorsa?

    
posta CodeYogi 14.12.2017 - 12:21
fonte

1 risposta

3

La mossa giusta qui è quella di separare i due concetti. Hai ruoli con un elenco di autorizzazioni e quindi hai una sorta di implementazione della whitelist in cui un determinato utente può accedere solo a risorse o tipi di risorse specifici.

Quindi, per prima cosa, definisci un elenco di permessi, vale a dire, tutte le possibili cose che un utente potrebbe essere in grado di realizzare. Nel tuo caso specifico, penso che sarebbero sufficienti:

  1. Può richiedere risorse per conto di Manager.
  2. Può richiedere risorse per conto del suo centro di costo.
  3. Può richiedere risorse consentite dalla lista bianca.
  4. Può richiedere qualsiasi risorsa.

Il tuo ruolo di regista sarebbe 1, 2 e 4. Potresti aggiungere anche 3, purché prima verifichi l'esistenza di 4 (in altre parole, se scritto correttamente, non dovresti mai perdere funzionalità nel tuo programma con aggiungendo un permesso).

Il tuo ruolo di manager avrebbe solo 2 e 4. Il tuo ruolo di dipendente avrebbe, hai indovinato, solo 3.

Quindi cosa succede quando ottieni un ruolo senza autorizzazioni? Un ruolo senza autorizzazioni è la funzionalità massima consentita che permetti a qualcuno senza autorizzazione (ovvero un ospite) ed è corretto che questo è il comportamento predefinito da un punto di vista della sicurezza.

Bene, ora hai i permessi. Ora tutto ciò che devi fare è implementare la whitelist. La lista bianca garantisce solo che un determinato dipendente può accedere a una determinata risorsa. Dimentica le autorizzazioni per un secondo e concentrati su questo semplice compito.

Una volta che hai entrambi, devi solo aggiungere un interruttore nel tuo codice per modificare un comportamento del tipo:

If user has permission 4:
   return getResource(resource)
Else if user has permission 3 and hasAccess(user, resource):
   return getResource(resource)
Else:
   throw new ResourceInaccessibleException();

Il trucco è solo fare una distinzione tra permesso e controlli eseguiti con o senza le suddette autorizzazioni. L'utilizzo di un modello di ruolo / permesso come questo è anche molto flessibile per te in futuro.

    
risposta data 14.12.2017 - 12:45
fonte