Jueves, 23 Febrero 2012

Code Igniter LogoComo dice el título, explicaré a grandes rasgos como crear un login con manejo de sesion con codeigniter 1.7.3, así que manos a la obra.

Lo primero es descargar codeigniter 1.7.3, lo descomprimos en nuestro directorio web, en mi caso es /home/USER/www si usas algún servidor web basado en windows como wamp la ruta es C:\wamp\www en el caso de Xampp es C:\xampp\htdocs.

una vez descomprimido el fichero procederemos a realizar algunas configuraciones como la conexion a la base de datos, que en nuestro caso es postgreSQL,  y otras como cargar bibliotecas para validación de formulario, utilitarios de URL, etc


Configurando Base de Datos

Usaremos la siguiente tabla para el ejemplo:

CREATE TABLE usuarios
(
  id serial NOT NULL,
  "name" character varying(200),
  username character varying(50) NOT NULL,
  "password" character varying(70) NOT NULL,
  CONSTRAINT usuarios_pkey PRIMARY KEY (id)
)

Debemos insertar un registro para realizar nuestras pruebas

INSERT INTO usuarios(name,username,password) values('Nombre de Usuario','admin',md5('2011'))

Cargamos nuestra base de datos en postgreSQL (no explicaré este proceso para no desviar el tutorial),ahora que tenemos nuestra base de datos cargada en postgreSQL, debemos congigurar nuesra conexion, para ello editamos el fichero database.php que está dentro de nuestro directorio application

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "postgres";
$db['default']['password'] = "2011";
$db['default']['database'] = "ci_db";
$db['default']['dbdriver'] = "postgre";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['port']       = "5432";    

los valores más importantes son el driver de conexion

$db['default']['dbdriver'] = "postgre";

Usuario, password, Host y database

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "postgres";
$db['default']['password'] = "2011";
$db['default']['database'] = "ci_db";

y por último el puerto de conexion, que no aparece en la plantilla de configuración por lo que debemos agregar el registro completo

$db['default']['port']       = "5432";

Configurado estos parámetros, editamos el fichero config.php que está dentro del directorio application y cambiamos la siguiente linea

$config['base_url']    = "http://example.com"; 

y lo dejamos por nuestra ruta

$config['base_url']    = "http://localhost/ci_ejemplo1/";

donde ci_ejemplo1 es el nombre del directorio que tiene la carpeta codeigniter situada en nuestro directorio web (C:\wamp\www o C:\Xampp\htdocs depende cual sea tu caso)

y para terminar nuestras configuraciones preliminares editamos el fichero autoload.php para cargar algunos helper y libraries de codeigniter

el fichero debe quedar con esta configuración

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


/*
| -------------------------------------------------------------------
|  Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
|    $autoload['helper'] = array('url', 'file');
*/

$autoload['helper'] = array('url');

Esto carga en nuestra app el helper file que no ayudará a conocer nuestro url base y las bibliotecas de base de datos, validación de formulario y manejo de sesiones.

Ahora que tenemos todo configurado manos a la obra, lo primero es mostrar la estructura de nuestra aplicación

application
css
images
index.php
js
license.txt
system

OJO la carpeta application fue movida a la raiz de nuestro proyecto por comodidad (está por defecto dentro de system), además creé 3 directorios más; css, images y js para cargar hojas de estilo bibliotecas javascript y imágenes

Ahora comenzaremos a dar forma a nuestra aplicación, lo primero accedemos a nuestro directorio application->controller y creamos un controlador nuevo llamado admin.php y colocamos el siguiente código

< ?php
/**
 * Author: Miguel Cantillana farias
 * web: http://www.miguelcantillana.com
 * */
class Admin extends Controller {
    
    //atributos privados
    private    $name    =    null;
    private $id        =    null;
    
    function Admin(){
        parent::Controller();
        
        $this->load->model('model_usuarios');    
    }
    
    function index(){
        redirect('admin/login');
    }
    
    function login(){
        
        //cargamos las reglas de validacion y definimos el callback para validar
        $this->form_validation->set_rules('username','Email','required|trim|callback_valida_login');
        $this->form_validation->set_rules('password','Contraseña','required|trim');

        //cuando se envia el formularipo
        if($this->form_validation->run()){

            //print_r($_POST);
            
            //creamos el array con el data session
            $data = array(
                'id_user' => $this->id,
                'name' => $this->name,                        
                'is_logged_in' => true
            );
            
            
            $this->session->set_userdata($data);

            //lo redireccionamos a nuestro controller
            //panel 
            redirect('panel');
            
        }
         
        
        $this->load->view('view_login');
        
    }
    
    function salir(){
        $this->session->sess_destroy();
        redirect('admin/login');
    }
    function valida_login(){
        
        if($this->input->post('username'))
        {
                        
            $options = array(
                'username'    =>    $this->input->post('username'),
                'password'    =>    $this->input->post('password'),
            );
            $user_result = $this->model_usuarios->listar_usuarios($options);
            
            //si existen registros como resultado
            if($user_result) {                
                
                //almacenamos el id_user y el nombre para incorporarlos a la session    
                $this->id        =    $user_result[0]->id;
                $this->name        =    $user_result[0]->name;
                
                return TRUE;    
            }    
            
            
        }
        
        $this->form_validation->set_message('valida_login', 'Email o Contraseña incorrectos.'); 
        return FALSE;
    }
}

/* End of file Admin.php */
/* Location: ./system/application/controllers/Admin.php */

Básicamente este controlador carga por defecto al ser llamdo por el navegador

http://localhost/ci_ejemplo1/index.php/admin

A su vez el controlador carga la vista view_login que esta en application->views

Qué no es más que un formulario HTML con un poco de CSS y en el action esta configurado para que lo procese el metodo login que está en el controlador admin.php (fijarse en la funcion login.php)

EL código no lo puedo pegar por que es HTML pero al final del tutorial les dejo el ejemplo

Validación de formulario

Revisaremos con un poco de detalle el proceso de validación del formulario de login y como validamos el usuario y password con el que está en la base de datos

Antes de detallar como procede la validación debemos crear nuestro model, que es el encargado de extraer los datos de nuestra base de datos, para ello en application->models creamos un nuevo fichero con el nombre model_usuarios.php y pegamos el siguiente código:

< ?php
class Model_usuarios extends Model{
      
        private $tabla = "usuarios";
        private $id = "id";
                    
        function Usuarios(){
            parent::__construct();        
            
        }
        
        
        /**
         * 
         * Obtiene elementos de la tabla
         * @param $options
         */
        function listar_usuarios($options = array()){

            if(isset($options[$this->id])){
                $this->db->where($this->id, $options[$this->id]);
            }

                    
            if(isset($options['username'])){
                $this->db->where('username', $options['username']);
            }
    
            if(isset($options['password'])){
                $this->db->where('password', md5($options['password']));
            }
                                
            $query = $this->db->get($this->tabla);
            
            //si en el arra defino count - entrga el conteo de rgistro
            if(isset($options['count'])){
                return $query->num_rows();
            } 
        
            return $query->result();
            
        }

        //parametro el SQL 
        function custom_query($sql){
            $query = $this->db->query($sql);
            
            if ($query->num_rows() > 0)        
                return $query->result();
                
            return false;
             
        }

    
}

Básicamente existe una función encargada de listar en base a un array de configuración que nosotros pasaremos por parámetro al modelo

Para cargar este modelo, lo debemos realizar desde el controlador admim.php

    function Admin(){
        parent::Controller();
        
        $this->load->model('model_usuarios');    
    }

Con $this->load->model('model_usuarios'); cargamos el controlador y lo hacemos en el constructor de la clase admin.php para que este presente en todo el controlador el objeto model_usuarios

¿Cómo validamos la Autentificación?

Primero cuando el usuario apriete el boton del formulario esté cargará el metodo login (como lo explicamos antes) que tiene lo siguiente:

function login(){
        
        //cargamos las reglas de validacion y definimos el callback para validar
        $this->form_validation->set_rules('username','Email','required|trim|callback_valida_login');
        $this->form_validation->set_rules('password','Contraseña','required|trim');

        //cuando se envia el formularipo
        if($this->form_validation->run()){

            //print_r($_POST);
            
            //creamos el array con el data session
            $data = array(
                'id_user' => $this->id,
                'name' => $this->name,                        
                'is_logged_in' => true
            );
            
            
            $this->session->set_userdata($data);

            //lo redireccionamos a nuestro controller
            //panel 
            redirect('panel');
            
        }
         
        
        $this->load->view('view_login');
        
    }

lo primero que vemos es :

        $this->form_validation->set_rules('username','Email','required|trim|callback_valida_login');
        $this->form_validation->set_rules('password','Contraseña','required|trim');

que basicamente setea las reglas de validación para nuestro formulario, lo intersante es que además de setear reglas como required, trim podemos cargar un callback personalizado, que quiere decir, que cuando evalue las reglas además llamará el callback (o método) valida login, quien será el encargado de validar nuestra autentificación, tal como sigue

    function valida_login(){
        
        if($this->input->post('username'))
        {
                        
            $options = array(
                'username'    =>    $this->input->post('username'),
                'password'    =>    $this->input->post('password'),
            );
            $user_result = $this->model_usuarios->listar_usuarios($options);
            
            //si existen registros como resultado
            if($user_result) {                
                
                //almacenamos el id_user y el nombre para incorporarlos a la session    
                $this->id        =    $user_result[0]->id;
                $this->name        =    $user_result[0]->name;
                
                return TRUE;    
            }    
            
            
        }
        
        $this->form_validation->set_message('valida_login', 'Email o Contraseña incorrectos.'); 
        return FALSE;
    }

Si observamos sólo validará el proceso si el dato $_POST contiene información en este caso creamos un array de connfiguración que luego lo pasamos como parámetro al modelo

      $options = array(
                'username'    =>    $this->input->post('username'),
                'password'    =>    $this->input->post('password'),
            );
            $user_result = $this->model_usuarios->listar_usuarios($options);

El modelo retorna los registros de la base de datos, si es que lo hay, retornando TRUE en caso afirmativo y FALSE en caso negativo, además en caso de FALSE seteamos el error personalizado

            if($user_result) {                
                
                //almacenamos el id_user y el nombre para incorporarlos a la session    
                $this->id        =    $user_result[0]->id;
                $this->name        =    $user_result[0]->name;
                
                return TRUE;    
            }    
$this->form_validation->set_message('valida_login', 'Email o Contraseña incorrectos.');
        return FALSE;

Si el resultado es TRUE pasa la validación hecha por

if($this->form_validation->run()){
    //set code here
}

al entrar en este IF, quiere decir que el formulario es valido y tenemos un usuario autenticado correctamente en nuestra aplicacion, lo que debemos hacer a continuación es cargar su info a la sesion y redirigirlo a otro controlador llamado panel.php, esto lo hacemos con el siguiente código:

        if($this->form_validation->run()){

            //print_r($_POST);
            
            //creamos el array con el data session
            $data = array(
                'id_user' => $this->id,
                'name' => $this->name,                        
                'is_logged_in' => true
            );
            
            $this->session->set_userdata($data);

            //lo redireccionamos a nuestro controller panel 
            redirect('panel');
            
        }

Con ello ya tenemos un login con manejo de sesion, si revisamos el controlador panel.php (el cual es redirigido) lo primero que observamos en el constructor es:

        $this->is_logged_in();

Qué es una función que creamos en controllador que valida que este con un sesion iniciada en caso contrario le solicita que lo haga

function is_logged_in()
    {
        $is_logged_in = $this->session->userdata('is_logged_in');
        
        if(!isset($is_logged_in) || $is_logged_in != true)
        {
            echo 'Tu no tienes permisos para acceder a esta pagina. Acceder?';    
            die();        
            //$this->load->view('login_form');
        }        
    }    

Con ello sólo podrán acceder al controlador panel.php usuarios autentificados

Con esto estamo OK con nuestro login, claramente hay muchas cosas sin explicar y otras no expuestas en el tutorial, pero lo pueden solventar revisando el código y los recursos que dejo más abajo, espero que sea de utilidad.

Recursos

Más tutoriales en http://codeigniter.com/wiki/Category:Help::Tutorials


blog comments powered by Disqus