Autenticare gli utenti con Zend_Auth - 2

IndexController

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('/');
    }
}
?>

2 commenti

1 enzo enzo martedì 30 giugno 2009, ore 23:12
scusate la mia ignoranza, il nome file della template quale dovrebbe essere?
2 Bruno Valenti Bruno Valenti lunedì 18 luglio 2011, ore 14:27
application/view/script/index/index.phtml
Effettua l'accesso o registrati per inserire un commento