2011-09-20 17 views
5

Sto costruendo un sistema in cui le organizzazioni immetteranno informazioni relative alla propria attività. La segnalazione deve essere disponibile per gli utenti su più livelli in cui alcuni utenti avranno accesso solo alle statistiche della loro organizzazione e gli utenti di livello superiore avranno accesso sia alle statistiche delle singole organizzazioni sia alle statistiche aggregate per le entità a un livello superiore (vedere il mio diagramma che illustra la gerarchia).Gestione delle autorizzazioni utente con una gerarchia

Example hierarchy

  • Ci saranno una o più organizzazioni all'interno di un comune.
  • Ci saranno uno o più comuni in una contea
  • Ci saranno uno o più contee in uno stato
  • ci saranno uno o più stati
  • organizzazioni, comuni, contee, e gli stati possono essere aggiunti
  • in qualsiasi momento
  • Quando un'organizzazione, un comune, una contea vengono aggiunti al sistema, un utente che dispone già dell'autorizzazione per visualizzare tale stato dovrebbe essere automaticamente in grado di visualizzare i report per la nuova organizzazione/comune/contea senza che un amministratore debba esplicitamente concedi loro il permesso. Lo stesso dovrebbe valere per gli utenti che hanno il permesso di visualizzare i report a livello comunale e di contea ogni volta che una nuova entità sotto di loro nella gerarchia viene aggiunta al sistema.

Alcuni esempi:

utente 1: possibile visualizzare solo i rapporti per l'organizzazione # 1

Utente 2: possibile visualizzare i rapporti per tutte le organizzazioni sotto Comune # 2

Utente 3: Può visualizzare i report per tutte le organizzazioni sotto Comuni n. 1 & # 2

Utente 4: possibile visualizzare i rapporti per tutte le organizzazioni sotto County # 3

Utente 5: possibile visualizzare i rapporti per tutte le contee sotto Stato # 3

La mia domanda è come faccio a organizzare questo? Non sono sicuro del modo migliore per assegnare autorizzazioni ai report senza assegnare autorizzazioni alle singole organizzazioni. Questo chiaramente non è pratico.

Ho visto alcune domande qui che trattano con ACL ma non sembrano applicarsi a questo. Se lo fa, una spiegazione di come si riferirebbe all'ACL sarebbe una risposta soddisfacente.

risposta

1

Sto pensando che un modo è quello che si assing un permesso unico id per ogni entità (oranisation, comune, contea, stato)

Quindi le tabelle dovrei avere una nuova colonna permission_id con la seguente forma: organizzazione 1 avrà permission_id O1 organizzazione 2 avrà il permesso id O2

Comune 1 avrà il permesso id M1 Comune 2 avrà il permesso id M2

e così via.

Quindi, è possibile fare una tabella di autorizzazioni (id, id_user, permessi) dove la colonna di autorizzazioni sarà qualcosa di simile O1 - permisssion solo per Organisation1 M1 - il permesso per tutte le organizzazioni in Comune 1 M1M2 - il permesso per tutte le organizzazioni comuni 1 e 2

S1 - il permesso per lo stato 1

Questa è solo la mia opinione. Finché sai che un utente ha accesso a un comune, dovrebbe avere accesso a tutto ciò che si trova in quel comune. Alcune funzioni PHP che possono ottenere il percorso dall'entità corrente possono corrispondere all'autorizzazione dell'utente.

esempio.

Sei in una pagina del comune. M2. Con un utente che dispone dell'autorizzazione per S2 , la tua funzione avrà come argomento l'ID del comune e la funzione creerà una rotta: M2, C3, S1. Si confronta quindi S2 con S1 e il permesso viene negato. In questo modo, la complessità è O (n) dove n è il numero di entità (org, municipalità, contee e stati, cioè 4).

4

Suggerirei di creare una serie di gruppi di utenti nel proprio database, ognuno dei quali ha uno o più livelli di account utente al suo interno, quindi assegnare un numero intero come valore gerarchico al gruppo, quindi fare lo stesso per il singolo account livelli all'interno del gruppo, qualcosa di simile (si tratta di una struttura relazionale, utilizzare InnoDB):

table: account_groups (Broader account groupings) 
Fields: 
-id_key - primary key, auto number 
-group - unique index 
-parent - index, foreign key=account_groups.group (this allows you to create group trees, so you can specify that a county group belongs to a state, and a municipality belongs to a county group, etc.) 
-group_hierarchy - integer (0 is highest permission group, each subsequent one step lower) 

table: account_levels (Account levels within a group) 
Fields: 
-id_key - primary key, auto number 
-account_level - unique index 
-group - index, foreign key=account_groups.group 
-account_heirarchy - integer (same as other table but denotes heirarchy within the group 

table: user_accounts (Individual user accounts) 
Fields: 
-id_key - primary key, auto number 
-account_id - unique index, user account name 
-account_level - index, foreign key=account_levels.account_level 

table: user_groups (denotes which tree(s) the user has access to) 
Fields: 
-id_key - primary key, auto number 
-account_id - index, foreign key=user_accounts.account_id 
-group - index, foreign key=account_groups.group 

E poi per i permessi:

table: permissions (directory of permissions that could be applied) 
Fields: 
-id_key - primary key, auto number 
-permission - unique index, permission identifier 
-other stuff you need associated with the individual permissions, based on how you want them to hook into your program 

table: permissions_group_permissions (permissions applied at group level) 
Fields: 
-id_key - primary key, auto number 
-group - index, foreign key=account_groups.group 
-permission - index, foreign key= permissions.permission 

table: permissions_account_permissions (permissions applied at account level) 
Fields: 
-id_key - primary key, auto number 
-account_type - index, foreign key=account_levels.account_level 
-permission - index, foreign key=permissions.permission 

table: permissions_individual_permissions (permissions applied to individual accounts, if neccessary) 
Fields: 
-id_key - primary key, auto number 
-account_id - index, foreign key=user_accounts.account_id 
-permission - index, foreign key=permissions.permission 
-allow_or_deny - boolean (TRUE means permission is granted, FALSE means permission if revoked. This allows you to fine tune individual accounts, either granting custom elevated permissions, or revoking individual permissions for troublesome accounts without demoting them from the group. This can be useful in some special circumstances) 
-expiration - timestamp (allows you to set expiration dates for permissions, like if you want to temporarily suspend a specific action. Programmatically set default value of 00/00/00 00:00:00 as indefinite. You can do this at the account and group levels too by adding this field to those tables.) 

è possibile quindi usare php per scorrere le autorizzazioni per il singolo account di fi per ottenere il gruppo associato al livello dell'account, creando una matrice di ogni gruppo successivo nell'ordine gerarchico, quindi eseguendo l'iterazione dell'ordine gerarchico per il gruppo corrente (aggiungi come array multidimensionale all'array di gruppi) dal livello di account corrente all'interno del gruppo all'ultimo livello di account esistente all'interno del gruppo. Successivamente si dovrebbe prendere tutto il livello di account per ogni gruppo successivo e infine recuperare tutte le autorizzazioni associate per ogni livello di account che è stato aggiunto all'array. Se si implementano le autorizzazioni individuali dell'utente, sarà necessario aggiungere l'array di autorizzazioni con le autorizzazioni applicate individualmente e infine rimuovere le autorizzazioni che dall'array hanno il proprio campo allow_or_deny impostato su FALSE. Se l'utente deve avere accesso a più alberi, si aggiunge un record alla tabella account_groups che corrisponde al proprio ID account, che indica quale sia il livello più alto dell'albero a cui hanno accesso e quindi itera su tutti i gruppi successivi nella struttura. Per concedere tutte le autorizzazioni applicabili all'account, prendi tutte le associazioni di gruppo per account_id da user_groups, quindi esegui il processo descritto in precedenza per ogni albero. Se hanno solo accesso a un albero, non è nemmeno necessario utilizzare la tabella user_groups.

an example of how the structure fits your model: 
group: USA, hierarchy = 0 
group: California, parent-> USA, hierarchy = 1 
group: Los Angeles, parent->California, hierarchy = 2 
group: Texas, parent->USA, hierarchy = 1 
group: Dallas, parent->Texas, hierarchy = 2 

I membri del gruppo USA possono accedere a tutto. I membri della California possono accedere a tutti i gruppi successivi nella gerarchia per la California, ma non i gruppi per il Texas, anche se hanno lo stesso valore gerarchico (perché sono diversi rami parentali)

account levels: 
admin, hierarchy=0 
manager, hierarchy=1 
analyst, hierarchy=2 
staff member, hierarchy=3 

Ogni livello di account ha tutte le autorizzazioni per ogni successivo livello di account.

user accounts: 
Bob, manager (likes to spam junk email to everyone) 

è ancora possibile revocare il permesso email per Bob aggiungendo il permesso e-mail a permissions_individual_permissions e impostando il valore allow_or_deny FALSE. Ciò consente di impedire a Bob di effettuare lo spamming senza sottrarlo alla gestione.

+0

Inoltre, questo consente di impostare diversi livelli di autorizzazione per diversi alberi, in modo che un singolo utente possa avere accesso allo stato in un albero, ma solo accesso municipale in un altro albero. – mopsyd

Problemi correlati