Zend_Acl e Zend_Auth - Sistema di autenticazione e autorizzazione con Zend Framework The Good2know Wall

Articoli Consigliati

Codemotion 2012 - Impressioni e tante emozioni.Codemotion 2012 - Impressioni e tante emozioni.

Come alcuni di voi hanno avuto modo di sapere dal post precedente, ho partecipato come speaker al Codemotion 2012. Il Codemotion è un evento organizzato dalla Facoltà...

Leggi l'articolo

Codemotion a Roma il 23-24 Marzo 2012 - Arduino, quando un aperitivo avvicina elettronica ed informatica.Codemotion a Roma il 23-24 Marzo 2012 - Arduino, quando un aperitivo avvicina elettronica ed informatica.

Cari lettori di Good2know, è con piacere che vi dò l'annuncio della mia presenza al Codemotion di quest'anno. La mattina del Sabato 24 Marzo, alle ore 09.50, terrò un...

Leggi l'articolo

La Successione di Fibonacci - VideoLa Successione di Fibonacci - Video

Ultimamente mi sono appassionato a giochi matematici ed enigmi. Mentre programmo una rubrica su enigmi e giochi matematici da pubblicare qui su Good2know, vi propongo questo...

Leggi l'articolo

Ecografia con l'iPhoneEcografia con l'iPhone

Se è vero il motto "C'è un'applicazione per tutto" anche il numero di gadget per smartphone sta raggiungendo questa definizione. E' il caso di un piccolo strumento...

Leggi l'articolo

Text shadow animation, testo in 3D con CSS3Text shadow animation, testo in 3D con CSS3

Girovagando per il web ho trovato un effetto con i nuovi css3 molto carino., fatto utilizzando i tag introdotti nella terza versione di CSS. Attraverso questi nuovi...

Leggi l'articolo

E dopo robots.txt è il momento di humans.txtE dopo robots.txt è il momento di humans.txt

Il file robots.txt penso che lo conosciamo tutti, è un file txt per aiutare i crawler dei motori di ricerca nell'indicizzazione. Bene, dopo i robot nei siti internet...

Leggi l'articolo

Zend_Acl e Zend_Auth - Sistema di autenticazione e autorizzazione con Zend FrameworkZend_Acl e Zend_Auth - Sistema di autenticazione e autorizzazione con Zend Framework

Zend_Acl è una delle tante classi di Zend molto utili. Consiste in una serie di funzionalità che permettono un controllo molto facile di CHI può fare COSA aumentando...

Leggi l'articolo

Zend_Auth - Gestire le autenticazioni semplicementeZend_Auth - Gestire le autenticazioni semplicemente

Zend_Auth è una classe di Zend Framework che permette la gestione dell'autenticazione su un sito in maniera molto semplice. Consiste in una serie di adapter per gli...

Leggi l'articolo

Aumentare le prestazioni di PHP con Facebook HipHopAumentare le prestazioni di PHP con Facebook HipHop

I carissimi programmatori di Facebook hanno rilasciato un piccolo progetto che ottimizza notevolmente le prestazioni, in fase di esecuzione, di codice php: Facebook HipHop. Come...

Leggi l'articolo

GoPano micro - lente per iPhone 4 per registrare video a 360 gradiGoPano micro - lente per iPhone 4 per registrare video a 360 gradi

Salve a tutti cari lettori, oggi vi vorrei presentare questo gadget per iPhone 4 che permette di registrare video a 360 gradi. Di seguito potete vedere un video d'esempio. Potete...

Leggi l'articolo

voglio una stampante 3D, ma il costo mi sembra ancora eccessivo per un privato. -.-'

Zend_Acl e Zend_Auth – Sistema di autenticazione e autorizzazione con Zend Framework

5

Scritto il 11/07/2011 da Filippo Matteo Riggio

Zend_Acl è una delle tante classi di Zend molto utili.

Consiste in una serie di funzionalità che permettono un controllo molto facile di CHI può fare COSA aumentando il livello di protezione del sistema e diminuendo le possibilità di errore da parte dello sviluppatore.

Un esempio:
L’amministratore del sistema potrà fare tutto.
Un utente normale potrà accedere solo ad alcune pagine(o risorse).

Risorse e ruoli.
Queste sono le due entità fondamentali quando si parla di controllo degli accessi.

Le risorse
Una serie di oggetti che si possono controllare, nel caso di pattern MVC, possono essere controller, action, percorsi, ecc.

I ruoli
Sono gli attori attivi del sistema che devono accedere alle risorse, ad esempio amministratori, utenti normali, moderatori, ecc.

Quindi andremo a crea un plugin di Zend che effettuerà i controlli.

I metodi da inserire nel plugin sono 2 :

  • __construct() : in cui andremo a specificare risorse, ruoli e permessi
  • preDispatch() : l’operazione preliminare alla chiamata di una action in cui effettuare il controllo

Operazioni da implementare nel __construct()

  1. Creazione dell’ istanza di Zend_Acl
  2. Creazione della risorsa
  3. Creazione del ruolo
  4. Aggiunta della risorsa all’ Access Control List
  5. Aggiunta del ruolo all’ Access Control List
  6. Definizione dei permessi su una risorsa da parte di un ruolo

Quindi di seguito il codice:

public function __construct() {
   // Creiamo l'istanza
   $acl = new Zend_Acl();

   // Creiamo la risorsa
   $resource1 = new Zend_Acl_Resource('nomeController1');
   $resource2 = new Zend_Acl_Resource('nomeController2');

   // Creiamo il ruolo
   $role = new new Zend_Acl_Role('nomeRuolo');

   // Associamo la risorsa all' ACL
   $acl->add($resource1);
   $acl->add($resource2);

   // Associamo il ruolo all' ACL
   $acl->addRole($role);

   // Andiamo a specificare i vari permessi
   // ad es: permettiamo al ruolo di accedere alla risorsa 1 e gli neghiamo la 2
   $acl->allow('nomeRuolo', 'nomeController1');
   $acl->deny('nomeRuolo', 'nomeController2');
}

Operazioni da implementare del preDispatch():

  1. Controllo dell’autenticazione dell’utente
  2. Controllo sui permessi della richiesta effettuata dall’utente

Quindi di seguito il codice:

// nel preDispatch() ho la richiesta fatta
public function preDispatch(Zend_Controller_Request_Abstract $request) {
   // controllo se l'utente è autenticato altrimenti lo credo un qualsiasi ospite
   if ($this->auth->hasIdentity()) {
      $role = $this->auth->getIdentity()->tipo_utente;
   } else {
      $role = 'ospite';
   }

   // controllo se il ruolo è contemplato nell'ACL
   if (!$this->acl->hasRole($role)) {
      $role = 'ospite';
   }

   // prendo il nome del controller come risorsa alla quale l'utente vuole accedere
   $resource = $request->controller;

   // prendo il nome dell'azione come privilegio alla quale l'utente vuole accedere
   $privilege = $request->action;

   // controllo se la risorsa è contemplata dall'ACL
   if (!$this->acl->has($resource)) {
      $resource = null;
   }

   // controllo se il ruolo non ha accesso alla risorsa e lo reindirizzo alla pagina per gli ospiti
   if (!$this->acl->isAllowed($role, $resource, $privilege)) {
      $request->setControllerName($this->_authController['controller']);
      $request->setActionName($this->_authController['action']);
   }
}

Questo è il plugin da andare ad aggiungere all’applicazione.
Per aggiungerlo andate nel file di bootstrap dell’applicazione (index.php o bootstrap.php) e aggiungete il plugin così:

// istanzio la Zend_Auth
$auth = Zend_Auth::getInstance();
$auth->setStorage(new Zend_Auth_Storage_Session());

// istanzio il Zend_Controller_Front
$controller = Zend_Controller_Front::getInstance();
$controller->registerPlugin(new CustomControllerAclManager($auth));

Abbiamo quasi finito, bisogna aggiungere la fase di checking dell’identità nel preDispatch() dei vari controller:

class CustomControllerAction extends Zend_Controller_Action {

   public function preDispatch() {
      $auth = Zend_Auth::getInstance();
      if ($auth->hasIdentity()) {
         $this->view->authenticated = true;
         $this->view->identity = $auth->getIdentity();
      } else {
         $this->view->authenticated = false;
      }
   }

}

Bene, con questo il sistema di accessi è terminato.
Possiamo far ereditare il controller ad altri controller figli così che non dobbiamo specificare il checking nel preDispatch() di tutti.

Per dubbi o chiarimenti commentate qui sotto!
Alla prossima!

Tags: , ,

Commenti (5)

Ciao.
Bella guida. Solo che io che sono alle prime armi non ho ben capito dove mettere alcune parti di codice. Se inserisco le funzioni di __construct() e preDispatch() in tutti i controllers e mettiamo il caso di averne tanti, ogni volta che modifico un qualcosa nella procedura, devo modificare le funzioni su tutti i controllers. Esiste un modo per definire queste funzioni una sola volta e farle richiamare da ogni controller?
Inoltre. Spesso avviene che i Ruoli e le Risorse siano dimamici in un sito. Es. nel mio i Ruoli li prendo da una tabella dove per ogni Controller definisco, in modo gerarchico, le autorizzazioni. Questa opportunità com’è gestita in Zend_Acl?

Grazie e complimenti ancora per la guida :)

Ciao Francesco, grazie per i complimenti, rispondo subito alla tua domanda.
Essendo nell’ambito della programmazione ad oggetti (OOP) il problema relativo alla replicazione del codice non esiste.
Se tu hai parti di codice identico su più controller puoi estrarlo e farne una superclasse che poi verrà ereditata dai vari controller.
Nell’esempio fatto tu vedi che il codice è implementato all’interno del CustomControllerAction, se tu avrai un controller per la gestione delle news, quindi NewsController, in cui hai necessità di avere il controllo dell’autorizzazione, NewsController erediterà da CustomController e non più da Zend_Controller_Action:
ad es: class NewsController extends CustomControllerAction.

Per avere più chiari i concetti di programmazione orientata agli oggetti ti consiglio questa guida: http://programmazione.html.it/guide/leggi/38/guida-programmazione-orientata-agli-oggetti/

Ciao e grazie ancora di leggere Good2know! ;)

Oh cavolo… ero incentrato alla semplice funzione e non c’ho proprio pensato all’eritarietà delle classi. Grazie!

Scusa… domanda forse stupida. Mi viene generato un errore sulla riga “$controller->registerPlugin(new CustomControllerAclManager($auth));” perchè non trova il CustomControllerAclManager. Siccome ho fatto delle modifiche. Con che nome lo dovrei sostituire?

Il nome del plugin deriva dal nome della classe del plugin stesso. Avrai la classe “class CustomControllerAclManager extends Zend_Controller_Plugin_Abstract” come plugin per le autorizzazioni.

Se cambi il nome al plugin anche il nome usato nella creazione di istanza dovrà cambiare.

Lascia un commento