Sto lavorando a un'applicazione Web con utenti con più ruoli e ogni utente può eseguire più operazioni, in base al ruolo dell'utente e il livello di autorizzazione che il ruolo ha sull'operazione. Ho trovato il seguente schema.
Utenti
+--------+-------------------+
| UserID | UserName |
+--------+-------------------+
| 1 | Alice |
+--------+-------------------+
| 2 | Bob |
+--------+-------------------+
| 3 | Charlie |
+--------+-------------------+
| 4 | David |
+--------+-------------------+
Ruoli
+--------+-----------------+
| RoleID | RoleName |
+--------+-----------------+
| 1 | Tech_Admin |
+--------+-----------------+
| 2 | Tech_Normal |
+--------+-----------------+
| 3 | Non_Tech_Admin |
+--------+-----------------+
| 4 | Non_Tech_Normal |
+--------+-----------------+
PermissionLevels
+-------------------+----------------------+
| PermissionLevelID | PermissionLevel |
+-------------------+----------------------+
| 1 | Tech_Account |
+-------------------+----------------------+
| 2 | Non_Tech_Own_Account |
+-------------------+----------------------+
| 3 | Non_Tech_Any_Account |
+-------------------+----------------------+
| 4 | Own_User |
+-------------------+----------------------+
UserRoles
+--------+--------+
| UserID | RoleID |
+--------+--------+
| 1 | 1 |
+--------+--------+
| 2 | 2 |
+--------+--------+
| 3 | 3 |
+--------+--------+
| 4 | 4 |
+--------+--------+
Comandi
+-----------+--------------+
| CommandID | CommandName |
+-----------+--------------+
| 1 | CREATE_USER |
+-----------+--------------+
| 2 | EDIT_USER |
+-----------+--------------+
| 3 | VIEW_USER |
+-----------+--------------+
| 4 | EDIT_PROFILE |
+-----------+--------------+
| 5 | VIEW_PROFILE |
+-----------+--------------+
| 6 | SUSPEND_USER |
+-----------+--------------+
RoleCommands
+--------+-----------+-------------------+
| RoleID | CommandID | PermissionLevelID |
+--------+-----------+-------------------+
| 1 | 1 | 1 |
+--------+-----------+-------------------+
| 1 | 1 | 3 |
+--------+-----------+-------------------+
| 2 | 2 | 1 |
+--------+-----------+-------------------+
| 3 | 2 | 2 |
+--------+-----------+-------------------+
| 4 | 5 | 4 |
+--------+-----------+-------------------+
Per semplicità, non ho descritto i dettagli dell'account ma ogni utente appartiene a un account: "Tech" o "Non-Tech". C'è solo 1 account Tech nel sistema.
Ecco le regole aziendali di esempio in base alla tabella RoleCommands
.
- L'amministratore tecnico può creare utenti nell'account tecnico.
- L'amministratore tecnologico può creare utenti in qualsiasi account non tecnologico.
- Tech Normal può modificare gli utenti nell'account tecnico.
- L'amministratore non tecnico può modificare gli utenti nel proprio account non tecnico.
- Non Tech Normal può visualizzare il proprio profilo, che dalla tabella significa che altri utenti non possono visualizzare il profilo di questo utente.
Quando ricevo una nuova richiesta API REST, identifico l'operazione in base ai parametri della richiesta e verifica se l'utente dispone dell'autorizzazione per eseguire le operazioni in base alla tabella RoleCommands. Questo sembra un progetto ragionevole per la gestione dei ruoli e dei permessi?
Aggiorna
Sembra che ci saranno troppi record nella tabella RoleCommands perché, per ogni comando, ci saranno diverse combinazioni con ruoli e livelli di autorizzazione. Per un dato oggetto, possono esserci n (per es .: 10) stati in cui l'oggetto può essere. Voglio dare l'autorizzazione del comando View_Object_Status1 a un utente in modo che l'utente possa visualizzare l'oggetto quando il suo stato è Status1. Ciò sta facendo esplodere la tabella RoleCommands. Qual è il modo migliore per semplificare questo?