L'intera idea del controllo degli accessi basato sui ruoli è che ogni utente può soddisfare più ruoli. Nel sistema semplice, ciascun ruolo può essere un superset di un altro ruolo, ad es. %codice%. Ma questo non deve essere il caso.
L'esempio più ovvio è quando abbiamo più istanze di una risorsa e un ruolo si applica solo a una singola istanza. Per esempio. un utente può essere amministratore su server-5 e server-3, ma non su altri server dove sono solo utenti. Ciò richiederebbe una configurazione come
roles = ['admin-5', 'admin-3', 'user']
È anche possibile che un sistema abbia più ruoli separati piuttosto che sottoinsiemi di permessi. Per esempio. un server FTP può essere configurato in modo che chiunque possa caricare i dati ma non scaricarli, ma anche in modo che tutti possano scaricare dati ma non caricarli. Così diversi utenti avrebbero set di ruoli diversi:
user1 = ['uploader']
user2 = ['downloader']
user3 = ['uploader', 'downloader']
Quindi, perché non creiamo un super ruolo con entrambe le autorizzazioni? Perché non admin > manager > user
? Quando le autorizzazioni sono connesse a un singolo ruolo anziché a un gruppo di ruoli, ciò rende le autorizzazioni più facili da gestire (emettere, visualizzare, revocare) e implementare. Per verificare se un utente può caricare:
if UPLOADER in roles:
ok
Con ruoli che ereditano da un altro, questo diventerebbe
if role == UPLOADER or role == FULLACCESS:
ok
che è difficile da estendere quando si crea un nuovo super ruolo che include l'autorizzazione dell'autore del caricamento.
O se introduciamo un sistema di ereditarietà in cui ogni permesso può comportare un controllo complicato:
if role.permits(UPLOAD):
ok
Chiaramente, questi sono più complicati. Quando si implementa la sicurezza, la complessità è pericolosa . Troppo facile introdurre un bug difficile da vedere che concede il permesso a chiunque.
Considerando che RBAC è semplice sia per gli utenti che per gli sviluppatori, non sorprende che sia comune nei sistemi più avanzati.
(Questa risposta non discute la differenza tra ruoli e permessi, che introduce un ulteriore livello di mapping.)