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: