Una de las principales dudas cuando te tratas de adaptar al uso de un framework es, conocer sus alcances y limitantes. Por lo general uno se empieza a preguntar ¿cómo aplico esto? ¿Cómo hago aquello? En fin. Escribí este Post para disipar las dudas en algunos casos y ampliarlas en otros, dependiendo la experiencia que tengas en el desarrollo. Espero que sea una guía útil y sobre todo me explique de una manera sencilla y contundente.

Para este sistema lo haremos en una manera sencilla, es decir no tocare puntos relacionados al ataque cruzado entre sitios ni ningún otro método de seguridad que complique el objetivo del tutorial. Prometo ampliar el tema en otro Post.

Paso 1: La base de datos

En nuestra base de datos Creamos una tabla llamada usuarios, por ello doy por hecho que ocupamos mysql,

CREATE TABLE `usuarios` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Ok, enseguida creamos un usuario.

insert into usuarios (username, password) values ('Uprueba', MD5('contrasenia'));

una vez creado el usuario: Uprueba con contraseña: contrasenia

Paso 2: Configurar la Base de datos en CodeIgniter

Actualizamos el archivo application/config/database.php y colocamos los parámetros

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'yourdbusername';
$db['default']['password'] = 'yourdbpassword';
$db['default']['database'] = 'yourdbname';

Paso 3: El controlador por default

Editamos el archivo application/config/routes.php para indicar la pagina por default.

$route['default_controller'] = "login";

Paso 4: Las librerias por default

Para configurar las librerías por default que se cargaran en todos los controladores, editamos application/config/autoload.php en este caso solo cargamos las de base de datos, la de sesión y el helper para la URL interna.

$autoload['libraries'] = array('database','session');
...
$autoload['helper'] = array('url');

Paso 5: Clave para encriptar

Cuando usas la libreria de sesión necesitas incluir la clave para encriptar en el archivo application/config/config.php.

$config['encryption_key'] = 'REALLY_LONG_NUMBER';

Paso 6: El modelo

El código para el modelo queda en User Model (application/models/Login_model.php)

<?php
Class Login_model extends CI_Model{
public function login($username, $password){
   $this -> db -> select('id, username, password');
   $this -> db -> from('users');
   $this -> db -> where('username', $username);
   $this -> db -> where('password', MD5($password));
   $this -> db -> limit(1);
   $query = $this -> db -> get();
   if($query -> num_rows() == 1){
     return $query->result();
   }else{
     return false;
   }
 }
//Leer los datos para devolverlas en variable de sesion
public function read_user_information($username) {
    $this->db->select('*');
    $this->db->from('users');
    $this->db->where('username', $username);
    $this->db->limit(1);
    $query = $this->db->get();

    if ($query->num_rows() == 1) {
     return $query->result();
    } else {
       return false;
    }
  }
}
// ?> No cerrar el PHP, puede causar un error

Paso 7: El Controlador

El controlador queda como Login Controller (application/controllers/Login.php)

<?php 
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends CI_Controller {

 function __construct(){
 parent::__construct();
   $this->load->helper('form'); 
   $this->load->library('form_validation'); 
   $this->load->library('session'); 
   $this->load->model('login_model');
 }

 function index(){
     $this->load->helper(array('form'));
    $this->load->view('login_view');
 }

public function user_login_process() {
      //Valida los campos 
        $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
        $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean');        
        if ($this->form_validation->run() == FALSE) {
            if(isset($this->session->userdata['logged_in'])){

                header('Location:'.base_url().'home_view.php');
            }else{
                $this->load->view('login_form');                
            }
        }else{
                $data = array(    'uuname' => $this->input->post('username'),
                                'upass' => md5($this->input->post('password')));                                
                $result = $this->login_model->login($data);            
                if ($result == TRUE) {                
                    $username = $this->input->post('username');
                    
                    $result = $this->login_model->read_user_information($username);
                
                    if ($result != false) {
                        $session_data = array(
                                                
                                                'username' => $result[0]->username,
                                                'iduser'=> $result[0]->id,
                                        );                                        
                        // Pasa el arreglo a la vista
                        $this->session->set_userdata('logged_in', $session_data);    
                        header('Location:'.base_url().'home_view.php');                                    
                       
                    }
                }else{
                    $data = array('error_message' => 'Usuario o Password No válidos.');
                    $this->load->view('login_form', $data);
                }
        }
    }
   public function logout() {
    
        // Elimina los datos de la sesión
        $sess_array = array(
        'username' => ''
        );
        $this->session->unset_userdata('logged_in', $sess_array);
        $data['message_display'] = 'La sesión finalizó correctamente.';
        $this->load->view('login_form', $data);
     }

}
// ?> No cerrar el PHP, puede causar un error

Paso 8: La vista

La vista queda como Login View (application/views/login_view.php)

<!DOCTYPE html>
<html>
 <head>
   <title>Login CodeIgniter</title>
 </head>
 <body>
   <h1>Login con CodeIgniter</h1>

     <?php
        if (isset($logout_message)) {
        echo "<div class='message'>";
        echo $logout_message;
        echo "</div>";
        }
        ?>
   <?php echo validation_errors(); ?>
   <?php 
    // Va al controlador y busca el método user_login_process

 echo form_open('login/user_login_process'); 

 ?> <label for="username">Username:</label> <input type="text" size="20" id="username" name="username"/> <br/> <label for="password">Password:</label> <input type="password" size="20" id="passowrd" name="password"/> <br/> <input type="submit" value="Login"/> </form> </body> </html>

Paso 9: La vista del Home

La vista del home queda en (application/views/home_view.php)

<!DOCTYPE html>
<html>
 <head>
   <title> Login con CodeIgniter - Acceso restringido</title>
 </head>
 <body>
   <h1>Home</h1>
   <h2>Hola<?php echo $username; ?>!</h2>
   <a href="login/logout">Logout</a>
 </body>
</html>