Gracias a un amigo, he descubierto CodeIgniter. Es un framework de PHP para desarrollar aplicaciones rápidamente y la verdad es que es una pasada. Según va cogiendo fuerza, van saliendo extensiones para CodeIgniter, y una de ellas es Flexi auth, el cual añade toda la funcionalidad para autenticación y permisos de usuario. El problema es que a diferencia de CodeIgniter, que tiene muy buena documentación paso a paso de como hacer las cosas, la documentación de Flexi auth es muy pobre. Tiene un buen tutorial de instalación y después te dicen “Mira, ahí tienes un ejemplo de las principales funcionalidades. Mírate el código”. La demo está muy completa, y ese es su fallo, tiene demasiada información para alguien que lo único que quiere es empezar poco a poco.
Así pues, voy a poner aquí lo imprescindible para tener la funcionalidad más básica del Flexi auth, que es hacer Login y Logout.
En mi sencillo ejemplo uso un único controlador, que es pages.php, siguiendo el ejemplo del tutorial de CodeIgniter. Solo voy a ir poniendo código que no apareciera en dicho tutorial.
El constructor de la clase Pages sería el siguiente:
public function __construct() {
parent::__construct();
$this->auth = new stdClass;
$this->load->library('flexi_auth');
$this->load->helper('url');
}
La creación del objeto auth es imprescindible para el funcionamiento de la librería Flexi auth, y después cargamos la librería extendida que nos dará la funcionalidad para el Login/Logout. El ayudante para URLs es útil a la hora de componer direcciones en las vistas, así como para las redirecciones.
public function login() {
$this->load->helper('form');
$this->load->library('form_validation');
// Set validation rules.
$this->form_validation->set_rules('login_identity', 'Usuario', 'required');
$this->form_validation->set_rules('login_password', 'Contraseña', 'required');
// Run the validation.
if ($this->form_validation->run()) {
// Verify login data.
$this->flexi_auth->login($this->input->post('login_identity'), $this->input->post('login_password'));
// Save any public status or error messages
// (Whilst suppressing any admin messages) to CI's flash session data.
$this->session->set_flashdata('message', $this->flexi_auth->get_messages());
// Reload page, if login was successful, sessions will
// have been created that will then further redirect verified users.
redirect('home');
} else {
// Set validation errors.
$this->data['message'] = validation_errors('<p class="error_msg">', '</p>');
return FALSE;
}
}
Esto está íntegramente sacado del código de la demo del Flexi auth, pero eliminando todo lo que no vamos a necesitar. Al final, solo dejamos primero la validación del formulario de Login, y si todo está correcto, intentamos hacer Login. Si hay éxito hacemos una redirección a la página principal, y en caso contrario, podemos mostrar un mensaje al usuario.
public function logout() {
// By setting the logout functions argument as 'TRUE', all browser sessions are logged out.
$this->flexi_auth->logout(TRUE);
// Set a message to the CI flashdata so that it is available after the page redirect.
$this->session->set_flashdata('message', $this->flexi_auth->get_messages());
redirect('home');
}
Más sencillo imposible. Creo que el código es bastante autoexplicativo. Vamos a por el formulario de Login. Este está en una vista llamada login.php:
<h2>Login</h2>
<?php echo validation_errors(); ?>
<?php echo form_open('login/login');?>
<label for="identity">Usuario</label>
<input type="input" id="identity" name="login_identity" /><br />
<label for="password">Contraseña</label>
<input type="password" id="password" name="login_password" /><br />
<input type="submit" name="login_user" id="submit" value="Login" />
</form>
Dos campos de texto (nombre de usuario y contraseña) y un botón. Importante que los nombres sean los mismos que tenemos en el método de Login.
También he introducido un poco de código en la cabecera de las páginas para que se muestre la información del estado del usuario (si está logueado o no):
<p>
<?php
if ($this->flexi_auth->is_logged_in()) {
?>
Usuario: <?php echo $this->flexi_auth->get_user_identity(); ?>
| <a href="<?php echo base_url('logout'); ?>">Salir</a>
<?php
} else {
echo 'Usuario no registrado';
}
?>
</p>
Simplemente compruebo si el usuario está logueado, en cuyo caso muestro su identificación y un enlace de Logout.
Por último falta añadir un par de rutas a routes.php:
$route['login/login'] = 'pages/login';
$route['logout'] = 'pages/logout';
Y con eso ya debería funcionar. En el próximo post haré el proceso de registro.