View Full Version : Gestire le autorizzazione in un'applicazione web
Salve,
supponiamo di avere un'applicazione a cui possono accedere utenti con ruoli diverso Ogni utente può eseguire delle azioni in base al proprio ruolo e in base alla sua identità.
Cosi ad esempio quando un utente clicca sul pulsante di modifica di un messaggio si controlla se l'autore del messaggio coincide con l'utente. In ogni pagina devono quindi essere eseguiti controlli di questo tipo; se ci sono molti tipi di utenti e molte possibili azioni la logica delle autorizzazioni viene ad essere "sparpagliata" su tutte le pagine ed è difficile gestirla e tenerla sotto controllo.
Voi come implementereste la cosa? Io pensavo di creare un componente (manager delle autorizzazioni) che può essere riferito ovunque nell'applicazione e in grado di concedere o negare un'azione. Pensavo di assegnare un codice identificativo ad ogni tipo di azione (ad esempio inserimento di un messaggio, modifica di un messaggio, ...), e all'oggetto su cui è eseguita l'azione (ad esempio il codice del forum ed eventualmente il codice del messaggio se l'azione riguarda un messaggio già inserito). Il manager delle autorizzazioni in base a questi codici risponde in modo affermativo o meno.
Ad esempio il manager delle autorizzazioni sa che in caso di modifica di un messaggio deve verificare che l'autore del messaggio coincida con l'utente corrente ed esegue la verifica interrogando le opportune tabelle del database. Chi scrive le pagine non deve preoccuparsi di come verificare le autorizzazioni, di quali tabelle andare a leggere, deve solo inviare la richista al manager.
Cosa ne pensate? Avete altre idee o conoscete altri modi standard di gestire la cosa?
La tua soluzione va benissimo. Però io, ipotizzando che tu debba fare un forum, progetterei tale "manager" in maniera dedicata per ogni tipo di "oggetto". Cioè un manager che gestisce l'autorizzazione nei 3d, un manager che gestisce le autorizzazioni a livello forum e così via. (Perché in generale solo una porzione delle autorizzazioni è uguale in tutte le "pagine"). (ereditarietà insomma)
Non devo fare un forum, comuqnue avevo gia in mente di creare diversi componenti, uno per ogni contesto dell'applicazione, a cui il manager reindirizza le richieste in base ai codici che riceve.
anonimizzato
23-09-2006, 18:18
Una sorta di tabella delle autorizzazioni come in MySQL giusto? Credo sia una buona idea.
Dal punto di vista del db nn spo quale sia la soluzione mgiliore, cioè se avere o meno una tabella che esplicitamente contiene le autorizzazioni. Se si adotta tale tabella i suoi record dovrebbero avere una struttura del tipo:
codice operazione | codice oggetto | codice utente
Così se la tabella contiene un record relativo all'utente X, all'operazione OP e all'oggetto OG allora l'utente X può eseguire l'operazione OP sull'oggetto OG, in caso contrario l'autorizzazione è negata.
Questa soluzione pero presesnta alcuni svantaggi:
1 - ridondanza delle informazioni: riprendendo l'esempio del forum, il fatto che un utente sia l'autore del messaggio gli conferisce automaticamente l'autorizzazione a modificarlo. Quindi questa autorizzazione viene ad essere memorizzata due volte nel database, una volta nella tabella che associa i messaggi agli autori e un'altra volta nella tabella delle autorizzazioni. E lo stesso varrebbe per tanti altri casi.
2 - Assegnare le autorizzazioni diventa più difficle: quando un utente scrive un messaggio bisogna parallelamente inserire nella tabella delle autorizzazioni un record che permetta all'utente di modificare il suo messggio, questa azione deve essere eseguita dalla componente applicativa che si occupa dell'inserimento del messaggi e quindi la gestione delle autorizzazioni sarebbe di nuovo frammentata. Alternativametne ogni componente apllicativa dovrebbe mandare al manager delle autorizzazioni una notifica delle azioni intervenute (ad esempio l'inserimento di un messaggio) in modo che il manager aggiorni la sua tabella, in questo caso pero ogni qualvolta un utente intraprende un azione il manager deve essere avvertito in modo che mantenga aggiornate le sue tabelle.
Se nn si utilizza la tabella delle autorizzazioni il manager calcola le autorizzazioni all'occorrenza in base ai dati già presenti nelle altre tabelle, questa soluzione pero può essere meno efficiente.
In entrambi i casi il manager deve essere in grado di calcolare un'autorizzazione in base ai dati delle tabelle; se si usa una tabella delle autorizzazioni, le autorizzazioni per un utente sono calcolate e aggiornate subito ogni qualvolta interviene un'azione, ma il manager deve ricevere le notifiche di tali azioni. Viceversa le autorizzazioni sono calcolate di volta in volta nel momento in cui sono richieste.
codice operazione | codice oggetto | codice utente
codice operazione | codice oggetto | codice gruppo
ovviamente devi creare una tabella gruppi_utente che definisce appunto i gruppi utente e ad ogni utente assegnare uno o più gruppi!
questo secondo me facilita la gestione in quanto gli utenti sarebbero raggruppati in gruppi e la definizione delle autorizzazioni sarebbe limitata appunto ai gruppi invece che ai singoli utenti!
per avere un miglior controllo sarebbe ancora meglio:
codice operazione | codice oggetto | codice gruppo | valore
così potresti assegnare sia un valore positivo che negativo ed avere un maggior controllo nel caso in cui un utente appartenga a due gruppi diversi che presentano un'incongruenza in una particolare voce!
mi sono spiegato male lo so ma è il meglio che riesco a fare ora come ora in questo stato...
...e che sono anche tornato presto stasera!
inoltre non ho letto bene tutto il messaggio quindi se ho cozzato mi faccio la figura del coglione e amen!
baci, 'iao
J2EE tu permette un approccio integrato totalmente dichiarativo al problema. Sei sicuro di aver bisogno di sviluppare una soluzione più flessibile?
-
1 - ridondanza delle informazioni: riprendendo l'esempio del forum, il fatto che un utente sia l'autore del messaggio gli conferisce automaticamente l'autorizzazione a modificarlo. Quindi questa autorizzazione viene ad essere memorizzata due volte nel database, una volta nella tabella che associa i messaggi agli autori e un'altra volta nella tabella delle autorizzazioni. E lo stesso varrebbe per tanti altri casi.
2 - Assegnare le autorizzazioni diventa più difficle: quando un utente scrive un messaggio bisogna parallelamente inserire nella tabella delle autorizzazioni un record che permetta all'utente di modificare il suo messggio, questa azione deve essere eseguita dalla componente applicativa che si occupa dell'inserimento del messaggi e quindi la gestione delle autorizzazioni sarebbe di nuovo frammentata. Alternativametne ogni componente apllicativa dovrebbe mandare al manager delle autorizzazioni una notifica delle azioni intervenute (ad esempio l'inserimento di un messaggio) in modo che il manager aggiorni la sua tabella, in questo caso pero ogni qualvolta un utente intraprende un azione il manager deve essere avvertito in modo che mantenga aggiornate le sue tabelle.
puoi risolvere entrambi i problemi creando l'astrazione del owner del msg
Nel senso puoi stabilire che l'utente X o appartenente al gruppo X puo editare i propri messaggi. Cosi non hai la ridondanza dell'informazione il msg Y è stato scritto da X.
J2EE tu permette un approccio integrato totalmente dichiarativo al problema. Sei sicuro di aver bisogno di sviluppare una soluzione più flessibile?
mi puoi linkare dove è spiegato l'approccio J2EE? grazie.
J2EE tu permette un approccio integrato totalmente dichiarativo al problema. Sei sicuro di aver bisogno di sviluppare una soluzione più flessibile?
Non utilizzo j2ee , asp.Net nel caso specifico. Qual è l'approccio in j2ee?
La sola appartenenza di un utente ad un gruppo nn mi basta per stabilire le azioni che un utente può compiere, ma in alcuni casi ho bisogno di conoscere l'identità dell'utente.
puoi risolvere entrambi i problemi creando l'astrazione del owner del msg
Nel senso puoi stabilire che l'utente X o appartenente al gruppo X puo editare i propri messaggi. Cosi non hai la ridondanza dell'informazione il msg Y è stato scritto da X.
Non devo implementare un forum, era solo un esempio per spiegare il problema, quindi gli scenari possono esere molto vari. In generale ci sono utenti divisi in gruppi. Un gruppo individua le opeazioni che un utente può fare, ma ogni utente di un gruppo puo lavorare solo sugli oggetti o task che gli vengono assegnati dai coordinatori o amministratori.
mi puoi linkare dove è spiegato l'approccio J2EE? grazie.
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Security4.html#wp473533
per le applicazioni web non è un modello molto flessibile, e va bene solo per piccole applicazioni o esigenze di profilazioni abbastanza semplici, ma come dicevo è integrato nel linguaggio e negli application server.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.