>L'applicazione ha una architettura 3-tiers con un service layer. Ora, in base a quale utente è loggato, >in corrispondenza di certi eventi, l'applicazione deve fare certe cose (ad esempio: se un 'user' >compie una certa operazione deve inviare una mail agli 'admin', ma se la compie un 'admin' >non deve fare nulla). Come si possono implementare certe politiche? Avete qualche rifeirmento/esempio?
Se queste "azioni" corrispondessero a servizi specifici del service layer (1 azione=1 servizio), potresti usare AOP implementando la spedizione della mail come "cross cutting concern". Una considerazione implementativa: se il service layer fosse basato su WCF, l'interception potrebbe essere effettuata usando la Enterprise Library (noi in azienda facciamo così) o Spring (non ho esperienza diretta, ma un amico lo ha utilizzato per un progetto importante ed è soddisfatto)
--.AGUISA - http://www.guisa.org UGIdotNET - http://www.ugidotnet.org Read my blog at: http://blogs.ugidotnet.org/pape
Una cosa importante è infatti capire che granularità di protezione/Funzionalità ti serve. Ad esempio mi pare di avere capito che hai situazioni in cui la stessa funzione, chiamata da due ruoli differenti, può fare due cose differenti (Ad esempio se chiamata da un non admin deve loggare o fare cose etc)
Per prima cosa secnodo me bisogna centralizzare la gestione dei ruoli e degli utenti, ad esempio in asp.net l'utente corrente con windows forms è membership.getuser, ma poi se sei in un servizio WCF questo non è solitamente vero. Per cui una delle prime cose è farsi una propria classe che centralizza queste operazioni con funzioni del tipo IsUserInRole etc.
Poi è necessario creare un metodo con cui le operazioni eseguite cambiano a seconda dei ruoli/utente, per questo ti viene in aiuto l'inversione di controllo, anche se non in maniera cosi diretta. Ad esempio nel servizio, invece di iniziare a mettere codice del tipo if ruolo = "admin" then, che è poco flessibile, strutturare il tutto in modo che ad ogni richiesta al servizio si risolva tramite IoC la classe concreta che eseguirà l'operazione. Comunque AOP ti viene in aiuto in ogni caso, ad esempio puoi utilizzare attributi custom nei tuoi servizi e mettere un aspetto che esaminando questi attributi decide cosa fare.
Ad esempio, metti che hai una situazione del tipo, "In alcune operazioni se l'utente appartiene al ruolo X o Z devi loggare cosa ha fatto". Puoi fare un attributo chiamato LogIfIsInRole("Admin,user"). Poi tramite AOP inietti un aspetto che per ogni operazione controlla se è presente questo attributo, se è presente controlla i ruoli e se il ruolo attuale è tra uno di quelli desiderati logga il nome funzione e tutti i parametri.
Il consiglio è comunque di cercare di capire prima possibile che tipologia di protezione deve effettuare, in modo da non trovarti con una soluzione che poi non ti permette di implemetnare tutto.
Alk.
--Blog Eng: http://www.codewrecks.com/blogBlog Ita: http://blogs.ugidotnet.org/rgmTwitter: http://twitter.com/alkampfer
Questo fine settimana sono un po impegnato nel finire di preparare gli esempi per il workshop dotnetmarche, se riesco a trovare un attimo di tempo provo a fare un mini esempio, ma non prometto nulla che in questo periodo il tempo scarseggia :P
alk.