Domanda

Faccio parte di un team che crea un'applicazione Web utilizzando PHP e MySQL. L'applicazione avrà più utenti con ruoli diversi. L'applicazione verrà inoltre utilizzata in modo geograficamente distribuito. Di conseguenza, dobbiamo creare un sistema di controllo degli accessi che opera ai seguenti due livelli:

  1. Controlla le autorizzazioni dell'utente per pagine php specifiche, ad esempio fornisce o nega l'accesso a pagine specifiche (o elementi dell'interfaccia utente) in base al ruolo dell'utente. Ad esempio: a un utente può essere consentito l'accesso a " Studenti " pagina ma non per " Insegnanti " pagina.
  2. Controlla le autorizzazioni utente per record di database specifici, ovvero modifica le query del database in modo che vengano visualizzati solo record specifici. Ad esempio, per un utente a livello di città, devono essere visualizzati solo i record relativi alla particolare città dell'utente, mentre per un utente a livello nazionale, devono essere visualizzati i record per TUTTE LE CITTÀ nel paese.

Ho bisogno di aiuto per progettare un sistema in grado di gestire entrambi questi tipi di controllo degli accessi. Punto n. 1 sembra essere abbastanza semplice. Tuttavia, sono completamente a corto di come fare il punto numero 2 senza codificare le informazioni nelle query SQL.

Qualsiasi aiuto sarebbe apprezzato.

Grazie in anticipo

Vinayak

È stato utile?

Soluzione

Ero in una situazione simile qualche mese fa. Ho scoperto che strumenti come Zend_ACL funzionano alla grande se controlli il livello di accesso a un singolo elemento (o un numero ragionevolmente basso di essi). Non riesce quando è necessario ottenere un elenco enorme di elementi a cui l'utente è autorizzato ad accedere. Ho creato una soluzione personalizzata a questo problema utilizzando il modello Business Delegate . BD fornisce una logica aziendale che può essere applicata in un contesto specifico. In questo scenario è stata consegnata una logica SQL e utilizzata come condizione di filtro in sottoselezione. Vedi i seguenti diagrammi:

 alt text
(fonte: epsi.pl ??)

E diagramma di sequenza che illustra l'ordine delle chiamate:

 alt text
(fonte: epsi.pl ??)

Ho scritto un blog su questa soluzione , sfortunatamente è tutto in polacco, ma potresti trovare utili parti di codice e diagrammi. Quello che posso dire, l'implementazione non è un gioco da ragazzi, ma dal punto di vista delle prestazioni è un campione rispetto al controllo dell'accesso iterativo per ciascun elemento dell'elenco. Inoltre, l'infrastruttura sopra non gestisce solo un tipo di elementi nell'elenco. Può servire quando si accede a elenchi diversi, sia che si tratti di un elenco di città, paesi, prodotti o documenti purché gli elementi nell'elenco implementino l'interfaccia IAuthorizable .

Altri suggerimenti

Non conosco i dettagli del tuo problema, ma Zend Framework ha un ACL e AUTH insieme di componenti potrebbe voler guardare. Roba buona come controllo di accesso molto preciso, archiviazione dei dati per la persistenza, regole condizionali avanzate.

Mi sembra che ciò di cui hai bisogno sia questo: (userò un esempio di paese / stato / città)

  1. Un elenco di tutti i paesi. Ogni "paese" ha un ID.
  2. Un elenco di tutti gli Stati all'interno dei paesi. Ogni stato è associato all'ID della nazione, ma ha anche un proprio ID univoco.
  3. Un elenco di tutte le città. Ogni città è legata a uno stato o direttamente a un paese e ha una bandiera per indicare quale.

Per un utente della città, ovviamente cerca e visualizza solo i record relativi alla città che corrisponde al suo ID. Tuttavia, per uno stato o un livello nazionale, cerca tutti i record relativi a ciascuna città che ha un ID corrispondente a quella nazione (o stato o che cosa hai).

Quindi, in sostanza, ogni sottogruppo dipende dal gruppo sopra di esso, e anche se non ricordo bene, credo che tu possa usare le sottoquery per fare il trucco da lì.

Se non sai come fare, utilizzerei un framework php come Zend Framework, CakePHP o Symphony. Hanno fatto il duro lavoro per te e hanno già in atto un qualche tipo di schema di controllo degli accessi.

Ho una soluzione simile da costruire e finora ho deciso di utilizzare specifiche e ruoli, quindi in effetti un ruolo avrebbe alcune specifiche di privilegio associate. Se sono tutti soddisfatti, l'autorizzazione viene concessa, altrimenti - ricade sull'accesso predefinito della risorsa.

Stavo guardando oltre per trovare qualcuno che stava già implementando la soluzione, ma sembra che nessuno l'abbia fatto. Speriamo che non sia un fallimento :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top