Autenticación en Zend Framework 2

El componente de autenticación en Zend Framework 2 nos sirve para identificarnos en la aplicación.
A continuación haremos un login de usuarios.

El controlador:

<?php
namespace Modulo\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Validator;
use Zend\I18n\Validator as I18nValidator;
use Zend\Db\Adapter\Adapter;
use Zend\Crypt\Password\Bcrypt;
use Zend\Authentication\Adapter\DbTable as AuthAdapter;

//Componentes de autenticación
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Storage\Session as SessionStorage;
use Zend\Session\Container;

//Incluir modelos
use Modulo\Model\Entity\UsuariosModel;

//Incluir formularios
use Modulo\Form\LoginForm;

class UsuariosController extends AbstractActionController{
    private $dbAdapter;
    private $auth;
    
	public function __construct() {
		//Cargamos el servicio de autenticación en el constructor
        $this->auth = new AuthenticationService();
    }
	
    public function indexAction(){
	//Vamos a utilizar otros métodos
        return new ViewModel();
    }
    
     public function loginAction(){
	 //
         $auth = $this->auth;
         $identi=$auth->getStorage()->read();
         if($identi!=false && $identi!=null){
            return $this->redirect()->toUrl($this->getRequest()->getBaseUrl().'/usuarios/dentro');
         }
        
		//DbAdapter
        $this->dbAdapter=$this->getServiceLocator()->get('Zend\Db\Adapter');
        
		//Creamos el formulario de login
		$form=new LoginForm("form");
        
		//Si nos llegan datos por post
		if($this->getRequest()->isPost()){
		
			/* Creamos la autenticación a la que le pasamos:
				1. La conexión a la base de datos
				2. La tabla de la base de datos
				3. El campo de la bd que hará de username
				4. El campo de la bd que hará de contraseña
			*/
            $authAdapter = new AuthAdapter($this->dbAdapter,
                                           'usuarios',
                                           'email',
                                           'password'
                                           );
										   
		   /*  
			Podemos hacer lo mismo de esta manera:
			$authAdapter = new AuthAdapter($dbAdapter);
			$authAdapter
                ->setTableName('users')
                ->setIdentityColumn('username')
                ->setCredentialColumn('password');
		   */

		   /*
		   En el caso de que la contraseña en la db este cifrada
		   tenemos que utilizar el mismo algoritmo de cifrado
		   */
            $bcrypt = new Bcrypt(array(
                                'salt' => 'aleatorio_salt_pruebas_victor',
                                'cost' => 5));
           
            $securePass = $bcrypt->create($this->request->getPost("password"));
            
			//Establecemos como datos a autenticar los que nos llegan del formulario
            $authAdapter->setIdentity($this->getRequest()->getPost("email"))
                        ->setCredential($securePass);
            
           
		   //Le decimos al servicio de autenticación que el adaptador
		   $auth->setAdapter($authAdapter);
		   
		   //Le decimos al servicio de autenticación que lleve a cabo la identificacion
           $result=$auth->authenticate();
         
		   //Si el resultado del login es falso, es decir no son correctas las credenciales
           if($authAdapter->getResultRowObject()==false){
		   
			   //Crea un mensaje flash y redirige
               $this->flashMessenger()->addMessage("Credenciales incorrectas, intentalo de nuevo");
               return $this->redirect()->toUrl($this->getRequest()->getBaseUrl().'/usuarios/login');
           }else{
		   
		     // Le decimos al servicio que guarde en una sesión 
			 // el resultado del login cuando es correcto
             $auth->getStorage()->write($authAdapter->getResultRowObject());
			 
			 //Nos redirige a una pagina interior
             return $this->redirect()->toUrl($this->getRequest()->getBaseUrl().'/usuarios/dentro');
           }
        }      
		
        return new ViewModel(
                array("form"=>$form)
                );
    }
    
    public function dentroAction(){
	//Leemos el contenido de la sesión
         $identi=$this->auth->getStorage()->read();
		 
         if($identi!=false && $identi!=null){
            $datos=$identi;
         }else{
             $datos="No estas identificado";
         }
         
         return new ViewModel(
                array("datos"=>$datos)
                );
    }
    
    public function cerrarAction(){
		//Cerramos la sesión borrando los datos de la sesión.
        $this->auth->clearIdentity();
        return $this->redirect()->toUrl($this->getRequest()->getBaseUrl().'/usuarios/login');
    }
}

El formulario:

<?php
namespace Modulo\Form;

use Zend\Form\Element;
use Zend\Form\Form;
use Zend\Form\Factory;

class LoginForm extends Form
{
    public function __construct($name = null)
     {
        parent::__construct($name);
        
      // $this->setInputFilter(new \Modulo\Form\AddUsuarioValidator());
        
       $this->setAttributes(array(
            //'action' => $this->url.'/modulo/recibirformulario',
            'action'=>"",
            'method' => 'post'
        ));
        
        $this->add(array(
            'name' => 'email',
            'attributes' => array(
                'type' => 'email',
                'class' => 'input form-control',
                'required'=>'required'
            )
        ));
        
         $this->add(array(
            'name' => 'password',
            'attributes' => array(
                'type' => 'password',
                'class' => 'input form-control',
                'required'=>'required'
            )
        ));
         
        $this->add(array(
            'name' => 'submit',
            'attributes' => array(     
                'type' => 'submit',
                'value' => 'Entrar',
                'title' => 'Entrar',
                'class' => 'btn btn-success'
            ),
        ));
 
     }
}

?>

Las vistas:

Login.phtml

<h1>Login en Zend Framework 2</h1>
<hr/>

<?php
$this->headTitle("Login usuarios");
$form = $this->form;
$form->prepare();
echo $this->form()->openTag($form);
?>
<div class="form_element">
<?php
    $email = $form->get('email');
    echo "Correo: ".$this->formInput($email);
    if(isset($error["email"])){
      echo $error["email"]['emailAddressInvalidHostname'];
    }
?>
</div>
<div class="form_element">
<?php
    $pass = $form->get('password');
    echo "Contraseña: ".$this->formInput($pass);
    echo $this->formElementErrors($pass);
?>
</div>

<?php 
echo $this->flashMessenger()->render();

echo $this->formElement($form->get('submit'));
echo $this->form()->closeTag(); 
?>

autenticacion en zend framework 2 login con zf2

Dentro.phtml

<?php 
//Comprobamos si nos llega la sesión correcta o no, esto se puede hacer de distintas formas
if(!is_string($this->datos)){
var_dump($this->datos->id);
echo "Bienvenido ".$this->datos->nombre." ".$this->datos->apellido."<br/>";
echo "Estas identificado con ".$this->datos->email;
?>
<p>
    <a class="btn btn-success" href="<?=$this->basePath("usuarios/cerrar")?>">Cerrar sesión</a>
</p>   
<?php  
}else{
    echo $this->datos;
}
?>

autenticacion en zend framework 2

Este componente es muy amplio, nos permite hacer mas cosas.

Más información:
Autenticación en la documentación oficial de Zend Framework 2

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post