posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

Design Pattern: Protection Proxy

Riprendiamo il discorso interrotto nel post precedente. Vediamo una seconda  variante del Proxy Pattern, il Protection Proxy. Questo pattern può essere utilizzato nel caso si  voglia fornire un controllo per l’accesso ad un oggetto master “sensibile”: l’oggetto proxy si preoccupa di verificare che il client abbia il permesso di utilizzare i metodi esposti dall’oggetto master.

Proviamo a chiarire il concetto con qualche esempio:

Supponiamo di avere un’interfaccia IEmployeeInfo contenente un metodo GetEmployeeName(). La classe concreta EmployeeInfo, implementazione di IEmployeeInfo, restituisce il nome dell’impiegato quando viene invocato il metodo GetEmployeeName() da un oggetto client. Vogliamo proteggere l’accesso a questo metodo da parte di tutti i client non autorizzati. Utilizzando il Pattern Protection Proxy, possiamo costruire una classe EmployeeInfoProxy che implementa IEmplyeeInfo, contenete un costruttore che accetta una coppia di username e password. Ad ogni invocazione del metodo GetEmployeeName() il proxy verifica che le credenziali specificate dal client risultino valide per eseguire la chiamata. In C#:

Interfaccia IEmployeeInfo

   1: public interface IEmployeeInfo
   2: {
   3:     string GetEmployeeName();
   4: }

Classe concreta EmployeeInfo:

   1: public class EmployeeInfo : IEmployeeInfo
   2: {
   3:     #region IEmployeeInfo Members
   4:  
   5:     public string GetEmployeeName()
   6:     {
   7:         return "Pietro Libro";
   8:     }
   9:  
  10:     #endregion
  11: }

EmployeeInfoProxy:

   1: public class EmployeeInfoProxy : IEmployeeInfo
   2: {
   3:     private string _username = "";
   4:     private string _password = "";
   5:  
   6:     EmployeeInfo _employeeClient = null;
   7:  
   8:     public EmployeeInfoProxy(string username, string password)
   9:     {
  10:         _username = username;
  11:         _password = password;
  12:         _employeeClient = new EmployeeInfo();
  13:     }
  14:     #region IEmployeeInfo Members
  15:  
  16:     public string GetEmployeeName()
  17:     {
  18:         ////Questo non dovrebbe mai essere fatto!!!
  19:         if (_username.Equals("123") && _password.Equals("456"))
  20:         {
  21:             return _employeeClient.GetEmployeeName();
  22:         }
  23:         else
  24:         {
  25:             return "Unauthorized access.";
  26:         }
  27:     }
  28:  
  29:     #endregion
  30: }

Esempio di utilizzo:

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         EmployeeInfoProxy proxy1 = new EmployeeInfoProxy("USR", "PWD");
   6:         Console.WriteLine(proxy1.GetEmployeeName());
   7:  
   8:         EmployeeInfoProxy proxy2 = new EmployeeInfoProxy("123", "456");
   9:         Console.WriteLine(proxy2.GetEmployeeName());
  10:  
  11:         Console.ReadLine();
  12:     }
  13: }

Che produce la schermata seguente:

image

Print | posted on mercoledì 30 giugno 2010 17:03 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET