Sistema de Login en Codeigniter

Publicado el 19-07-2012 | TAGS: codeigniter | (23 comentarios)

En este primer artículo que estrena mi blog, quiero empezar con algo instructivo y sencillo. En este caso desarrollaremos un ejemplo de Sistema de Usuarios ó Login, utilizando para ello el Framework de PHP, CodeIgniter, que trabaja con un paradigma MVC (Modelo Vista Controlador).

Para la realización de este ejemplo, crearemos los siguientes archivos:

- Para el Modelo:

login_model.php

- Para el controlador:

login.php

- Para la vista:

login.php
login_error.php
login_success.php

- Para nuestra base de datos, definiremos una tabla sencilla:

  1. CREATE TABLE usuarios (
  2. username VARCHAR(20),
  3. );

Controlador

Empezamos creando el archivo del controlador, el cual realizará las operaciones pertinentes de los resultados que obtenga como respuesta del modelo, y en cada caso responderá de un modo u otro.

  1. class Login extends CI_Controller
  2. {
  3.  
  4.     public function __construct()
  5.     {
  6.     parent:: __construct();
  7.     $this->load->model('login_model');
  8.     $this->load->helper('form');
  9.     $this->load->library('form_validation');
  10.     $this->load->library('session');
  11.     }
  12.    
  13.     public function index()
  14.     {
  15.  
  16.    
  17.         if(!isset($_POST['username']))
  18.         {
  19.         $this->load->view('login'); //si no recibimos datos por post, cargamos la vista del formulario
  20.         }
  21.         else
  22.         {
  23.         //definimos las reglas de validación
  24.        
  25.         $this->form_validation->set_rules('username','Usuario','required|min_lenght[5]|max_lenght[20]');
  26.         $this->form_validation->set_rules('password','Password','required');
  27.        
  28.             if($this->form_validation->run() == FALSE) //si no supera las reglas de validación se recarga la vista del formulario
  29.             {
  30.             $this->load->view('login');
  31.             }
  32.             else
  33.             {
  34.             $isValidLogin = $this->login_model->getLogin($_POST['username'],$_POST['password']); //pasamos los valores al modelo para que compruebe si existe el usuario con ese password
  35.            
  36.                 if($isValidLogin)
  37.                 {
  38.                 // si existe el usuario, registramos las variables de sesión y abrimos la página de exito
  39.                
  40.                     $sesion_data = array(
  41.                                     'username' => $_POST['username'],
  42.                                     'password' => $_POST['password']
  43.                                         );
  44.                     $this->session->set_userdata($sesion_data);
  45.                
  46.                 $data['username'] = $this->session->userdata['username'];
  47.                 $data['password'] = $this->session->userdata['password'];
  48.                    
  49.                 $this->load->view('login_success',$data);
  50.                 }
  51.                 else
  52.                 {
  53.                 // si es erroneo, devolvemos un mensaje de error
  54.                 $this->load->view('login_error');
  55.                 }
  56.             }
  57.        
  58.        
  59.         }
  60.        
  61.        
  62.     }
  63.    
  64.    
  65.    
  66.  
  67.     public function data()
  68.     {
  69.         if($this->session->userdata['username'] == TRUE)
  70.         {
  71.         echo $this->session->userdata['username'];
  72.         echo "<br>";
  73.         echo $this->session->userdata['password'];
  74.         }
  75.     }
  76.    
  77.    
  78.     public function destroy()
  79.     {
  80.     //destruimos la sesión
  81.     $this->login_model->close();
  82.  
  83.         echo "Sesión borrada"."<br>";
  84.        
  85.  
  86.     }
  87.    
  88.    
  89.     public function perfil()
  90.     {
  91.     //pagina restringida a usuarios registrados.
  92.     $logged = $this->login_model->isLogged();
  93.        
  94.         if($logged == TRUE)
  95.         {
  96.         echo "Tienes permiso para ver el contenido privado";
  97.         }
  98.         else
  99.         {
  100.         //si no tiene permiso, abrimos el formulario para loguearse
  101.         $this->load->view('login');
  102.         }
  103.     }
  104.    
  105.    
  106.  
  107.    
  108.  
  109. }

En primer lugar, creamos nuestra clase Login, extendiendola a CI_Controller para que nuestra clase herede los métodos de la superclase de CodeIgniter. Seguidamente creamos el constructor de nuestra clase en la que cargamos las librerías, helper y modelo que necesitaremos.

Creamos la función index, que en primer lugar comprueba si está definida la variable username (que habremos de recibir de nuestro formulario de login). En el caso de que esta variable no este definida, quiere decirque nuestro usuario aún no nos envío el formulario, por lo cual abrimos la vista del formulario. En caso contrario, en primer lugar definimos las reglas de validación de los campos "Username" y "Password". En este caso, para Username, hemos definido que sea un campo requerido y tenga una longitud de entre 5 y 20 caracteres y para el campo Password, hemos definido que debe ser un campo requerido.

Tras ello, comprobamos si el usuario ha rellenado los datos del formulario correctamente, cumpliendo con la validación. Si no pasa este filtro, le devolveremos a la vista del formulario y en caso contrario, le pasaremos los parámetros de usuario y contraseña al método "getLogin" que hemos definido en el modelo. Este método definirá si el usuario existe en la base de datos y si los datos de usuario y contraseña son coincidentes.

Si la validación es correcta, definimos y creamos las variables de sesión y pasamos estos datos a la vista, para que se carguen en el archivo login_success.php y nos muestre el mensaje de éxito. En caso contrario, cargaremos en la vista el archivo login_error.php.

Adicionalmente, crearemos otras dos funciónes para realizar pruebas sobre el sistema, una para que nos muestre el resultado en el caso de que queramos cerrar sesión. A este método lo llamaremos "Destroy", el cual solamente hará una llamada a al método "Close", definido en el método y mostraremos un mensaje informativo.

La otra función la llamaremos perfil, la cual restringirá el acceso solamente a usuarios registrados. Para ello, haremos una llamada al método "isLogged", definido en el modelo, el cual devolverá TRUE o FALSE, en el caso de que nos encontremos logueados o no. En este caso, si nos encontramos logueados, nos mostrará un mensaje informativo, y en caso contrario, nos cargará la vista del formulario.

Modelo

Estará definido por tres funciones más su constructor.

  1. class login_model extends CI_Model
  2. {
  3.  
  4.     public function __construct()
  5.     {
  6.     $this->load->library('session');
  7.     $this->load->database();
  8.     }
  9.    
  10.    
  11.     public function getLogin($username,$password)
  12.     {
  13.     //comprobamos que el nombre de usuario y contraseña coinciden
  14.     $data = array(
  15.     'username' => $username,
  16.     'password' => $password
  17.     );
  18.    
  19.     $query = $this->db->get_where('usuarios',$data);
  20.     return $query->result_array();
  21.     }
  22.    
  23.    
  24.     public function isLogged()
  25.     {
  26.     //Comprobamos si existe la variable de sesión username. En caso de no existir, le impediremos el paso a la página para usuarios registrados
  27.    
  28.         if(isset($this->session->userdata['username']))
  29.         {
  30.         return TRUE;
  31.         }
  32.         else
  33.         {
  34.         return FALSE;
  35.         }
  36.        
  37.     }
  38.    
  39.    
  40.    
  41.     public function close()
  42.     {
  43.     //cerrar sesión
  44.     return $this->session->sess_destroy();
  45.     }
  46. }

En primer lugar el constructor, cargará las librerías "Session" y "Database".

Seguidamente definimos la función "getLogin", a la que le pasamos dos parametros, que definirán el usuario y la contraseña de nuestro visitante. La función hace una consulta a la base de datos y devuelve el resultado de la misma. En caso de no existir el usuario en nuestra base de datos devolverá un valor FALSE.

La siguiente función "isLogged" tomará como referencia la variable de sesión "userdata" para comprobar si esta está definida y saber así si el usuario ha iniciado sesión. En caso afirmativo, devolverá TRUE, de lo contrario, devolverá FALSE.

Por último, creamos la función "Close" que se ocupará de destruir las variables de sesión llamando al método de CI sess_destroy().

Vista

Estará compuesta por tres archivos, uno de ellos el formulario para que el usuario introduzca sus datos y otros dos informativos del éxito el el error en el inicio de la sesión.

  1. <?php echo validation_errors(); ?>
  2. <? echo form_open('login/index');?>
  3. <label>Usuario</label><br>
  4. <input type="text" id="username" name="username"><br><br>
  5. <label>Password</label><br>
  6. <input type="password" id="password" name="password">
  7. <br><br>
  8. <input type="submit" value="Enviar">
  9. <? echo form_close();?>

  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  3.  
  4. </head>
  5.  
  6. Logueado con éxito
  7. </body>
  8. </html>
login_success.php

  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  3.  
  4. </head>
  5.  
  6. Error en el inicio de sesión
  7. </body>
  8. </html>
login_error.php

En el formulario hacemos uso de las funciones de CI "validation_errors()" para que nos muestre el mensaje con los errores que surjan en el caso de que el usuario no cumpla con los requisitos definidos en el controlador, "form_open() y form_close()" para que defina las etiquetas de apertura y cierre del formulario.

En los otros dos archivos de vista, solamente mostramos mensajes informativos del éxito o error al tratar de iniciar la sesión.

Os invito a probar este ejemplo y a comentar si hay algo que no os salió bien y poder mejorar este sencillo ejemplo.

Comentarios

Marcelo Castillo escrito el 04-11-2013

realmente bueno me sirvió de gran ayuda pero una consulta si creo la session en el controlador login como puedo hacer que esta session se extienda a otro controlador agradeceria mucho tu ayuda gracias!!!

jlkaaalkjl ljklkj escrito el 09-10-2013

lkjjlkjkññlkjkjñkjlñjkljlkñjlk lkjlkjlkj

Ruben escrito el 03-09-2013

de mucha ayuda. gracias. Funciona perfecto.
Solo resta que detalles como usar desde la vista las funciones Perfil o isValidLogin para poner en cada vista y que no lleguen directo a ella...

Gracia nuevamete.!

ANGEL escrito el 22-08-2013

EL UNICO DETALLE ESTA EN LA VISTA DE ACCESO SI NO LES CORRE ESTO ES LO QUE CORREGUI

















ANGEL escrito el 22-08-2013

amigo realice todo tal cual pero el boton de enviar no me genera ninguna accion? alguien tiene la solucion

yuma2020 escrito el 14-08-2013

Les queria agregar que el metodo $_POST no sigue el proceso que por el cual trabaja codeigniter pero felizmente funciona
el procedimiente correcto es por via de $username = $this->input->post('username'); atravez de objetos.

yuma2020 escrito el 14-08-2013

Hola Funciona totalmente nada mas le faltaba las llaves de php de entrada y salida.
lo cargas en la base de datos con la extencion *.sql y cargas los datos donde correspondan. Saludos de posadas, misiones, argentina Exitos.

Lucas escrito el 09-08-2013

Que tal, quería hacer una salvedad en el modelo están los metodos isLogged() y close() , estos no tienen nada que ver con acceso a la base de datos, estos no deberian ir en el controlador? que es donde esta separada la capa de negocios? .
Pregunto, porque según entendi el paradigma MVC sirve para separar la capa de datos de la de negocios y tambien de la presentación (vista) .
Saludos .

Freddy Barrera escrito el 16-07-2013

Excelente, solo mencionar que se debe configurar el archivo database.php dentro de la carpeta config :
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'sesiones';
$db['default']['dbdriver'] = 'mysql';

en le archivo config.php de la carpeta config, cambiar el "base_url" :
$config['base_url'] = 'http://localhost/sesiones/';

y en el archivo routes de la carpeta config cambiar el "default_controller":
$route['default_controller'] = "login";


Saludos!

jose maria escrito el 10-06-2013

A mi me funciono correctamente tras poner:
$config['encryption_key'] = 'MySql'; en application/config/config.php

gracias por el tutorial
dustin escrito el 04-06-2013

Me estoy iniciando en php y codeigniter. Quise probar este ejemplo de login, cree cada uno de los ficheros en las carpetas indicadas y puse esta linea en el routes.php
$route['default_controller'] = "login"; para indicar q corra a partir de este controlador.

Pero cuando carga el sitio con el navegador me da errores. Me gustaria me aclaran q adactaciondes deberia hacercele al ejemplo para q funcione. Aki pego lo q me sale en el naegador. Gracias de ante mano.

load->model('login_model'); $this->load->helper('form'); $this->load->library('form_validation'); $this->load->library('session'); } public function index() { if(!isset($_POST['username'])) { $this->load->view('login'); //si no recibimos datos por post, cargamos la vista del formulario } else { //definimos las reglas de validación $this->form_validation->set_rules('username','Usuario','required|min_lenght[5]|max_lenght[20]'); $this->form_validation->set_rules('password','Password','required'); if($this->form_validation->run() == FALSE) //si no supera las reglas de validación se recarga la vista del formulario { $this->load->view('login'); } else { $isValidLogin = $this->login_model->getLogin($_POST['username'],$_POST['password']); //pasamos los valores al modelo para que compruebe si existe el usuario con ese password if($isValidLogin) { // si existe el usuario, registramos las variables de sesión y abrimos la página de exito $sesion_data = array( 'username' => $_POST['username'], 'password' => $_POST['password'] ); $this->session->set_userdata($sesion_data); $data['username'] = $this->session->userdata['username']; $data['password'] = $this->session->userdata['password']; $this->load->view('login_success',$data); } else { // si es erroneo, devolvemos un mensaje de error $this->load->view('login_error'); } } } } public function data() { if($this->session->userdata['username'] == TRUE) { echo $this->session->userdata['username']; echo "
"; echo $this->session->userdata['password']; } } public function destroy() { //destruimos la sesión $this->login_model->close(); echo "Sesión borrada"."
"; } public function perfil() { //pagina restringida a usuarios registrados. $logged = $this->login_model->isLogged(); if($logged == TRUE) { echo "Tienes permiso para ver el contenido privado"; } else { //si no tiene permiso, abrimos el formulario para loguearse $this->load->view('login'); } } } ?>
A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at D:\Sitios\xampp\htdocs\CodeIgniter_mintur\application\controllers\login.php:111)

Filename: core/Common.php

Line Number: 442
404 Page Not Found

The page you requested was not found.


Stephanie escrito el 02-06-2013

De gran ayuda!.. el error que comentan algunos que el boton enviar no funciona se arregla completando la etiqueta de php
""
""

Saludos!
carlos luis escrito el 01-06-2013

GRACIAS por el codigo, me sirvio, claro tiene un pequeños errores que hay que adaprtarlos para que funcione bien,
jose lui escrito el 30-05-2013

No se que pasa pero no pone el codigo borrare algunas letras

'>

jose escrito el 30-05-2013

perdon no se vio en el comentario anterior

'>


jose luis escrito el 30-05-2013

He probado tu codigo, pero al apretar el boton enviar no pasa nada, crea un formulario e hice eso

'>


haciendo esto parece responder pero me manda una pagina con error 403, imagino el error esta en esta linea

echo form_open('login/index');?>'>

Por qu eno encuetro nada parecido a eso , algun ayuda

andrea escrito el 13-05-2013

por fin encontré un login que funciona correctamente :) y es fácil de adaptar !!!!
Muchas gracias!!!!

helen escrito el 03-04-2013

gracia me ayudo mucho

helen escrito el 03-04-2013

gracia me ayudo mucho

Beimar trujillo escrito el 01-04-2013

me sale el siguiente error

In order to use the Session class you are required to set an encryption key in your config file.
ya agregue esto
$Config ['encryption_key']='Sqlserver';
en aplication/config/config.php
pero sigue sin Funcionar

quedo muy agradecido de antemano por tu colaboracion
Cordial saludo

manuel escrito el 25-02-2013

muy bueno

Alejandro escrito el 28-01-2013

Muy bueno el tutorial!!! Lo voy a poner en práctica!!

jose antonio, el error suena a que no se ha cargado la librería 'database', podrías agregarla en application/config/autoload.php así:

$autoload['libraries'] = array('database');

saludos!!!

jose antonio escrito el 13-01-2013

Hola, probando este ejemplo me sale el siguiente error:

An Error Was Encountered

Unable to load the requested class: database

Tengo la base de datos creada y no se por qué no me la encuentra.

Escribe tu comentario