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