Quiero compartir con ustedes una manera de manejar el tema de las sesiones de usuarios, que es algo muy importante y que a veces nos complica la vida.
Esta es una forma muy fácil y simple pero también con gran flexibilidad. Permite controlar y verificar la sesión de un usuario y tambien obtener los datos del usuario de forma fácil en toda la aplicación. Dependiendo de su creatividad pueden hacer muchas cosas más.

Voy a dejar al final el link de descarga del ‘application’ completo. Lo hice con la versión 2.1.0 de CI.
Le explico un poco como es que funciona. La lógica principal esta en el controlador de sesión, y en la extensión de el CI_Controller:
application/controllers/session.php:
- Código: Seleccionar todo
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Controlador de sesion de usuarios
*/
class Session extends CI_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
//Si un usuario accede a esta zona con una sesion abierta,
//le limpiamos los datos de sesion
if($this->session->userdata('usuario') && $this->router->method != 'logout') {
redirect('salir');
}
}
/**
* Accion para iniciar sesion
*/
public function login()
{
//Se comprueba si los datos necesario existen
if(!empty($_POST['nombre']) && !empty($_POST['clave'])) {
//Cargamos el modelo
$this->load->model('mdl_usuarios');
//Chequemos los datos ingresados en la db
$usuario = $this->mdl_usuarios->checkLogin($_POST['nombre'], $_POST['clave']);
//Si el usuario existe en la db..
if(!empty($usuario)) {
//Le quitamos la clave de los datos de sesion por seguridad
if(isset($usuario->clave)) { unset($usuario->clave); }
//..lo guardamos en sesion
$this->session->set_userdata('usuario', $usuario);
//Ahora, comprobamos si existio alguna pagina a donde se quiso
//entrar antes de loguearse (ver core/MY_Controller.php linea 20)
if($this->session->userdata('lastPageVisited')) {
redirect($this->session->userdata('lastPageVisited'));
} else {
//y si no existe lo enviamos al index de administracion
redirect(site_url('admin/index'));
}
}
}
//Si no hay datos, o si falla la validacion mostramos el formulario
$this->load->view('session/login');
}
/**
* Accion para eliminar los datos de sesion
*/
public function logout()
{
//Limpiamos los datos de session
$this->session->unset_userdata('usuario');
$this->session->unset_userdata('lastPageVisited');
//Y redireccionamos
redirect('entrar');
}
}
Es un simple formulario en donde se toman los datos de autenticación y se chequean con un modelo. Si todo va bien se guarda en una variable de sesión. Nada de otro mundo jeje.
application/core/My_Controller.php:
- Código: Seleccionar todo
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
//Clase de controlador, personalizado para la zona de Administracion
class Admin_Controller extends CI_Controller
{
//Variable con los datos de usuario
public $usuario;
public function __construct()
{
parent::__construct();
//Se comprueba que el usuario este logueado
if (!$this->session->userdata('usuario')) {
//Como no esta logueado, se guarda la pagina de la peticion
$this->session->set_userdata('lastPageVisited', current_url());
//Y se redirecciona al formulario para iniciar sesion
redirect(site_url('entrar'));
}
//Si esta logueado, lo guardamos en una variable publica para tener un
//a sus datos en toda la aplicacion
$this->usuario = $this->session->userdata('usuario');
}
}
Aquí esta la parte creativa. Creamos una clase Admin_Controller que extiende de CI_Controller. En el constructor de la clase chequeamos la sesión del usuario, si la sesión existe guardamos los datos de usuario en una variable para que este fácilmente disponible en la aplicación con $this->usuario. En caso contrario, si no existe, lo mandamos a que inicie sesión. Ahora.. como aplicamos esto?? ..
application/controller/admin.php
- Código: Seleccionar todo
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Controlador de ejemplo de administracion
*
* NOTA: Extiende de Admin_controller
*/
class Admin extends Admin_Controller
{
/**
* Accion index de admin
*/
public function index()
{
$this->load->view('admin/index');
}
/**
* Zona uno de administracion
*/
public function zona_uno()
{
$this->load->view('admin/zona_uno');
}
/**
* Zona dos de administracion
*/
public function zona_dos()
{
$this->load->view('admin/zona_dos');
}
}
Aquí es donde lo aplicamos. Si ven bien, la clase no extiende del clásico CI_Controller, sino del nuevo Admin_Controller. Esto habilita el chequeo de sesión. Si ustedes poseen muchos controladores de administración, lo único que deben cambiar es la extensión del controlador y con eso ya estará activa la validación de usuario para las zonas privadas de la aplicación.
Espero que les sirva. Creo que no hay nada mas que explicar, en la descarga podrán ver los demás archivos como los views o el model que en este caso no eran importante como publicarlos y explicar que es lo que hacen.
Si tienen dudas pueden consultar
Saludos

