Considerato lo scopo didattico di questa applicazione e senza perdere di generalità, si è scelto di implementare tutto il sistema di login e logout direttamente nell'IndexController. Analizziamo il funzionamento delle diverse Action:
indexAction: quando viene mostrata la pagina principale di login (nel nostro caso si tratta dell'unica pagina realizzata) dobbiamo semplicemente passare al template i dati relativi ad un eventuale utente loggato. In questo modo il template potrà mostrare un messaggio di benvenuto personalizzato.
loginAction: questa action viene invocata quando l'utente effettua il submit del form di login. Per verificare le credenziali ricevute bisogna prima effettuare il setup di Zend_Auth_Adapter_DbTable. Dopo aver verificato che username e password non sono vuote, passiamo questi dati all'Adapter e li verifichiamo chiamando authenticate(). Attraverso $result controlliamo l'esito della procedura. In caso di errore mostreremo un messaggio. Se invece l'utente viene riconosciuto memorizziamo nello Storage lo user_id ed il nome dell'utente. La procedura si conclude con il redirect alla stessa pagina di login.
logoutAction: viene invocata dall'utente cliccando su un link "logout". L'operazione richiede semplicemente l'esecuzione del metodo clearIdentity() di Zend_Auth.
<?php
class IndexController extends Zend_Controller_Action
{
protected $_flashMessenger = null;
public function init()
{
$this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
$this->view->messaggi = $this->_flashMessenger->getMessages();
}
public function indexAction()
{
$this->view->identity = Zend_Auth::getInstance()->getIdentity();
}
public function loginAction()
{
$db = Zend_Registry::get('db');
$my_auth_adapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'user_name', 'password', 'MD5(?)');
$username = trim($this->_getParam('username'));
$password = trim($this->_getParam('password'));
// non possiamo invocare authenticate() se username o password sono vuoti
// altrimenti Zend_Auth_Adapter_DbTable solleva una eccezione
if(!$username || ! $password) {
$this->_flashMessenger->addMessage('Username o password non inserita');
$this->_redirect('/');
}
$my_auth_adapter->setIdentity($username)->setCredential($password);
$result = $my_auth_adapter->authenticate();
// dal codice contenuto nel risultato dell'autenticazione recuperiamo l'esito
// potevamo usare semplicemente $result->isValid()
switch ($result->getCode()){
//Login riuscito.
case Zend_Auth_Result::SUCCESS :
// la verifica è andata a buon fine
// dobbiamo quindi memorizzare i dati dell'utente nello Storage di Zend_Auth (Zend_Auth_Storage_Session)
// non memorizziamo tutti i dati del record della tabella relativa all'utente ma solo quelli di nostro interesse
Zend_Auth::getInstance()->getStorage()->write($my_auth_adapter->getResultRowObject(array('user_id', 'nome')));
// per memorizzare tutti i dati del record, tranne la password
//$this->_auth->getStorage()->write($adapter->getResultRowObject(null, 'password'));
break;
//Username non trovato
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND :
$this->_flashMessenger->addMessage('Username non trovato');
break;
//Password non corretta
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID :
$this->_flashMessenger->addMessage('Password errata');
break;
//Errore sconosciuto
default:
$this->_flashMessenger->addMessage('Errore Sconosciuto');
break;
}
$this->_redirect('/');
}
public function logoutAction()
{
// per effettuare il logout basta cancellare i dati dell'utente corrente
// memorizzati in Zend_Auth_Storage_Session
// con il seguente metodo sarà lo Zend_Auth ad occuparsene
Zend_Auth::getInstance()->clearIdentity();
$this->_flashMessenger->addMessage('Log-out effettuato con successo.');
$this->_redirect('/');
}
}
?>