Login y autentificación con Zend Framework

Traducción del original: Login and Authentication with Zend Framework de Matthew Weier O’Phinney.

Me han enviado una sería de preguntas de personas que quieren saber como se maneja la autentificación y la persistencia(* de sesión) de usuarios con Zend Framework. El típico problema es no estar seguro como combinar:

  1. Un adaptador de autentificación
  2. Formulario de acceso
  3. Controlador de Loggin y Logout
  4. Comprobar usuario en posteriores peticiones

No es demasiado difícil, pero necesitas saber trabajar con MVC y la utilización de Zend_Auth. Vamos a echar un vistazo.

Adaptador de autentificación

Para que esto funcione necesitas un adaptador de autentificacion(* Zend_Auth). No voy a entrar en detalles sobre esto; podrá encontrar más información en la documentación oficial, el uso varia según el sitio. Voy a imaginar que un adaptador de autentificación necesita un nombre de usuario y contraseña como información de autentificación. nuestro formulario de acceso utilizará este adaptador, sino simplemente tener un lugar de recuperación.

Formulario de acceso

El formulario es bastante simple. Puedo configurar algunas de las reglas de validación para prevenir errores en la consulta de la base de datos, pero de una menra relativamente simple. Para los propositos de este tutorial, vamos a definir los siguientes criterios: -el nombre del usuario debe ser sólo caracteres alfabéticos, y contener entre 3 y 20 caracteres -la contraseña constará de caracteres alfanuméricos, y debe tener entre 6 y 20 caracteres. el formularios sería algo así:

class LoginForm extends Zend_Form
{
public function init()
{
$username = $this->addElement(‘text’, ‘username’, array(
‘filters’ => array(‘StringTrim’, ‘StringToLower’),
‘validators’ => array(
‘Alpha’,
array(‘StringLength’, false, array(3, 20),
),
‘required’ => true,
‘label’ => ‘Your username:’,
));

$password = $this->addElement(‘password’, ‘password’, array(
‘filters’ => array(‘StringTrim’),
‘validators’ => array(
‘Alnum’,
array(‘StringLength’, false, array(6, 20),
),
‘required’ => true,
‘label’ => ‘Password:’,
));

$login = $this->addElement(’submit’, ‘login’, array(
‘required’ => false,
‘ignore’ => true,
‘label’ => ‘Login’,
));

// We want to display a ‘failed authentication’ message if necessary;
// we’ll do that with the form ‘description’, so we need to add that
// decorator.
$this->setDecorators(array(
‘FormElements’,
array(‘HtmlTag’, array(‘tag’ => ‘dl’, ‘class’ => ‘zend_form’)),
array(‘Description’, array(‘placement’ => ‘prepend’)),
‘Form’
));
}
}

Controlador de Loggin

ahora vamos a crear el controlador para el Login y Logout. Las caractaristica típicas sería así:

  1. Usuario rellena el formulario de acceso
  2. Usuario envía el formulario
  3. El controlador haría lo siguiente:
  4. Responde con los errores en caso de encontrarlos.
    -El éxito de la validación redirecciona a la página principal.
    -El usuario registrado(exitosamente) se redirige a la página principal.
  5. -salida del suario, por petición de este, a la página del formulario de acceso.

El controlador de Login(LoginController) hará uso del adaptador de autentificación elegido. así como el formulario de acceso. Vamos a pasar al formulario de acceso, contruir el formulario y el método de la acción. Cuando tengamos valores válidos, se lo pasa a nuestro adaptador de autentificación. Así que vamos a crear el controlador. En primer lugar, le vamos a crear el formulario y el adaptador de autentificación.

class LoginController extends Zend_Controller_Action
{
public function getForm()
{
return new LoginForm(array(
‘action’ => ‘/login/process’,
‘method’ => ‘post’,
));
}

public function getAuthAdapter(array $params)
{
// Leaving this to the developer…
// Makes the assumption that the constructor takes an array of
// parameters which it then uses as credentials to verify identity.
// Our form, of course, will just pass the parameters ‘username’
// and ‘password’.
}
}

Luego tenemos que verificar los envios, antes de caulquier cosa para ganrantizar los siguiente: -si el usuario ya está auntentificado,(* y a salido por algun motivo y vuelve a entar) hay que redirigirle a la página(*sin que haga nada) -El usuario no está auntentificado, porque ha cerrado la seción, hay que redirigirle a la página de acceso. La siguiente rutina”preDispatch()” lo hará por nosotros.

class LoginController extends Zend_Controller_Action
{
// …

public function preDispatch()
{
if (Zend_Auth::getInstance()->hasIdentity()) {
// If the user is logged in, we don’t want to show the login form;
// however, the logout action should still be available
if (‘logout’ != $this->getRequest()->getActionName()) {
$this->_helper->redirector(‘index’, ‘index’);
}
} else {
// If they aren’t, they can’t logout, so that action should
// redirect to the login form
if (‘logout’ == $this->getRequest()->getActionName()) {
$this->_helper->redirector(‘index’);
}
}
}
}

ahora tenemos que hacer nuestro formulario de acceso. Este es el metodo más simple que recupera el constructor el formulario y lo pinta en la salida del (x)html.

class LoginController extends Zend_Controller_Action
{
// …

public function indexAction()
{
$this->view->form = $this->getForm();
}
}

El procesamiento del formulario implica un poco más de lógica. tenemos que verificar que tenemos un puesto de petición, luego que el formulario sea válido y por último que los datos sean validos.

class LoginController extends Zend_Controller_Action
{
// …

public function processAction()
{
$request = $this->getRequest();

// Check if we have a POST request
if (!$request->isPost()) {
return $this->_helper->redirector(‘index’);
}

// Get our form and validate it
$form = $this->getForm();
if (!$form->isValid($request->getPost())) {
// Invalid entries
$this->view->form = $form;
return $this->render(‘index’); // re-render the login form
}

// Get our authentication adapter and check credentials
$adapter = $this->getAuthAdapter($form->getValues());
$auth    = Zend_Auth::getInstance();
if (!$auth->isValid($adapter)) {
// Invalid credentials
$form->setDescription(‘Invalid credentials provided’);
$this->view->form = $form;
return $this->render(‘index’); // re-render the login form
}

// We’re authenticated! Redirect to the home page
$this->_helper->redirector(‘index’, ‘index’);
}
}

Por ultimo, podemos añadir la acción de cerrar sesion. estó es tan simple como borrar los datos de autentificación. <<CODIGO seis>> Bueno, es todo para nuestro controlador de autentificación

class LoginController extends Zend_Controller_Action
{
// …

public function logoutAction()
{
Zend_Auth::getInstance()->clearIdentity();
$this->_helper->redirector(‘index’); // back to login page
}
}

Comprobación de los usuarios autentificados

La úlima parte de la pregunta es: ¿Cómo determinar si un usuario está autentificado, y restringir el acceso si no? Si se mira con detenimiento el método “preDispatch()” en las lineas anteriores(más arriba) se puede ver ya la forma de hacerlo. Zend_Auth persiste en la identificación de posteriores sesiones, lo que le permitirá consultar directamente utilizando esta construcción: Zend_Auth:: getInstance () -> hasIdentity () Puede utilizar esto para determinar si el usuario está conectado y, a continuación, utilizar el redireccionamiento para redirigirle a la página de acceso si no está conectado. Puede tirar de la identidad del objeto Auth. $ Identidad = Zend_Auth:: getInstance () -> getIdentity (); Esto podría ser colocado en un Helper para mostrar el estado de la utentificación. por ejemplo:

/**
* ProfileLink helper
*
* Call as $this->profileLink() in your layout script
*/

class My_View_Helper_ProfileLink
{
public $view;

public function setView(Zend_View_Interface $view)
{
$this->view = $view;
}

public function profileLink()
{
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$username = $auth->getIdentity()->username;
return ‘<a href=”/profile’ . $username . ‘”>Welcome, ‘ . $username‘</a>’;
}

return ‘<a href=”/login”>Login</a>’;
}
}

Conclusión

Zend_Auth hace un montón de trabajo por detrás de las escenas para que la persistencia de una identidad en el periodo de sesiones sea trivial. Combínalo con Zend_Form(* si de verdad te vale) y podrás implementarlo fácilmente para la recuperación y validación de los usuarios. Añade utilidades(*preDispatch()) en el Zend_Controller() y se puede restringir el acceso a las apliaciones, basados en la autentificicación.

Sin comentarios

No comments yet

Leave a reply