Esistono due approcci comuni a questo problema, entrambi comportano la divisione delle operazioni consentite in qualcosa di discreto che è possibile nominare. (Elimina post, crea gallerie, aggiorna il codice, scarica il database, lancia i missili, apri la porta del garage.) Dai a ciascuno di questi una bitmap in un bitvector (se hai intenzione di avere meno di 32 permessi, questo è un bel e meccanismo di archiviazione compatto, se pensi che crescerà oltre 32 autorizzazioni, la dimensione di un intero tipico, quindi forse una tabella nel tuo database ..)
Quindi, puoi mappare gli utenti direttamente ai permessi ("I desidera concedere gallery_create
-sarnold
") oppure è possibile mappare gli utenti ei permessi tramite classi di utenti (" voglio concedere gallery_create
a tutti i membri della classe art_curator
, poi voglio promuovere utente sarnold
docent
-art_curator
").
Se si mappano gli utenti direttamente ai permessi, è possibile che in anni successivi si verifichi un intreccio di strane autorizzazioni nell'implementazione. Se si associano gli utenti alle classi, è possibile che vi troviate con classi artificiali di utenti perché ci si è fidati di una persona specifica con un privilegio, ma non di altri privilegi.
Capire il modo migliore per affrontare questa mappatura è ancora un problema aperto; Ho scritto su diversi tipi di modelli di permesso Modelling a permissions system che potrebbero essere troppi o potrebbero essere troppe poche informazioni, a seconda di quanto complicato vorreste che il vostro sistema diventasse.
Se si desidera solo autorizzazioni di archivio in bitmap (ad esempio, l'implementazione del kernel di Linux di CAPABLE()
per CAP_SYS_ADMIN
, CAP_DAC_OVERRIDE
, e così via), allora si potrebbe aggiungere nuovi privilegi con qualcosa di molto semplice:
if (requested_new_permission == "CAP_SYS_ADMIN")
user->permissions |= CAP_SYS_ADMIN;
else if (requested_new_permissions == "CAP_DAC_OVERRIDE")
user->permissions |= CAP_DAC_OVERRIDE;
...
Poi, quando è necessario per testare le capacità:
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
e la macro CAPABLE()
può apparire come:
#define IN GRADO (utente, cap) ((utente) -> permessi & (PAC))
(Perdonate la C, io proprio non lo so php molto bene; Sono stato costretto a sistemare troppi bug php per volerlo imparare da solo.)
Se si desidera mappare gli utenti alle autorizzazioni per le classi di utenti, allora potrebbe essere tre tabelle: una tabella users
, un tavolo o groups
classes
, e un tavolo da permissions
. classes
ha colonne per user_id
e permission_id
. Quando è necessario verificare se è possibile concedere un'autorizzazione, selezionare la classe dell'utente, quindi selezionare l'autorizzazione nella classe. (Sono passati anche anni da quando ho scritto a mano SQL, sono sicuro che una singola query può darti una risposta sì o no, ma non sono sicuro se sarebbe un join di più tabelle o usare sottoquery o se sarebbe solo più facile fare due query al database. :)
Spero che questo aiuti.
Cerca in Live_User PEAR. È un po 'vecchio e non è mai diventato uno standard, ma gestisce la maggior parte delle autorizzazioni di microgestione. – mario