Sistema de login en CI

213 views
Skip to first unread message

Pasky

unread,
Oct 16, 2009, 3:58:24 PM10/16/09
to codeignit...@googlegroups.com
Buenas noches.

Ya estoy dando pasitos en CI y he creado una aplicación sencilla. El
siguiente paso que quiero hacer es darle autenticación para que no se
pueda acceder anónimamente a la aplicación. He estado mirando la ayuda
de la clase Session y más o menos tengo claro el funcionamiento de las
sesiones, cómo crearlas o eliminarlas.

Lo que no tengo claro es cómo desarrollar el controlador. He empezado por esto:


?php

class Principal extends Controller {

function Principal()
{
parent::Controller();
if (!$this->session->userdata('usuario_id')){
redirect('principal/login', 'refresh');
}
}

function index()
{
/* Aquí controlador index, donde cargo el menú principal */
}

function login()
{
if ($this->input->post('usuario')){
$usuario = $this->input->post('usuario');
$contrasena = $this->input->post('contrasena');
$this->Admin_Model->verificaUsuario($usuario, $contrasena);
if ($_SESSION['usuario_id'] > 0){
redirect('principal/index', 'refresh');
}
}
// Cargamos la vista del formulario de login
/* $this->load->view('login', $data); */
echo 'Estamos en login';
}

}


En el constructor compruebo la sesión, y, si ésta no existe, redirigo
la página al controlador de login que cargará el formulario
correspondiente.

El problema creo que está en que como la function login está dentro de
la clase Principal, ésta también comprueba la sesión, y como sigue sin
existir, me hace un bucle infinito para redireccionarme al login.

He pensado que quizás la comprobación la debiera hacer en la function
index, y que sea ésta la que redirija a login, pero no lo tengo muy
claro, y es por esto por lo que os pido algo de consejo sobre cómo es
la mejor manera de realizar mi propósito. Si alguien me puede explicar
a grosso modo el flujo que debe seguir la aplicación para crear
sesiones usando autenticación, me vendría muy bien.

Como siempre... muchas gracias por vuestra ayuda.

--
Un saludo
Pasky

Nokrosis

unread,
Oct 16, 2009, 4:05:31 PM10/16/09
to codeignit...@googlegroups.com
Exacto, debería estar en la función index. Incluso, yo sugeriría que las páginas que requieran login estén en otra clase, así manejas esa validación en el constructor.


class Principal extends Controller
{
  function Principal()
  {
    parent::Controller();
  }

  function login()
  {
    // aqui el login
  }
}

class Aplicacion extends Controller
{
  function Aplicacion()
  {
    parent::Controller();
    // Validas login
  }

  function index()
  {
    // aqui el indice de la aplicacion.

Pasky

unread,
Oct 17, 2009, 3:00:52 AM10/17/09
to codeignit...@googlegroups.com
2009/10/16 Nokrosis <nokr...@gmail.com>:

> Exacto, debería estar en la función index. Incluso, yo sugeriría que las
> páginas que requieran login estén en otra clase, así manejas esa validación
> en el constructor.
>
> class Principal extends Controller
> {
>   function Principal()
>   {
>     parent::Controller();
>   }
>
>   function login()
>   {
>     // aqui el login
>   }
> }
>
> class Aplicacion extends Controller
> {
>   function Aplicacion()
>   {
>     parent::Controller();
>     // Validas login
>   }
>
>   function index()
>   {
>     // aqui el indice de la aplicacion.
>   }
> }

Gracias Nokrosis por sacarme de dudas y por tu sugerencia, aunque no
domino tanto CI como para saber hacer lo que me has sugerido. Perdonad
mi ignorancia.

He conseguido que la autenticación me funcione y lo he documentado en
mi blog (sin ánimo de hacer publicidad, sino de compartir para
aprender con vuestras correciones y sugerencias). Sin embargo me ha
surgido la siguiente duda. Cada aplicación que tenga, que va en un
controlador distinto (gestion_lineas.php, gestion_equipos.php,
gestion_incidencias.php) necesito que se acceda con la autenticación
creada, pero no es así, sino que se accede directamente poniendo
http://host/ci/controlador/. El único que me pide la autenticación es
el controlador principal que me carga el menú de las distintas
aplicaciones. Supongo que tendré que hacer un include o algo parecido
para que todos los controladores requieran tener creada la sesión, o
si no, sean reenviadas al form_login del controlador principal. ¿De
qué manera sería mejor hacer esto? He pensado meter en el constructor
de cada controlador la siguiente comprobación:

// si no existe la sesión con la variable 'usuario_id'


if (!$this->session->userdata('usuario_id')){

// redirigimos a la función login


redirect('principal/login', 'refresh');
}

Creo que esto es correcto, pero ¿es la mejor forma de hacer lo que pretendo?

Como siempre, muchas gracias.

--
Un saludo
Pasky

Gorka Garin

unread,
Oct 17, 2009, 7:24:16 AM10/17/09
to codeignit...@googlegroups.com
Hola Pasky, yo te voy a dar mi humilde opinión. Lo que suelo hacer es crear una clase que se va encargar de : validar usuario y crear session, comprobar el tiempo de la session y renovarlo por cada interacción, o eliminar la session si ha pasado un tiempo X inactivo, hacer logout cuando el usuario desee salir del sistema,...

Cuando tengas la clase creada, la puedes poner en el autoload.php y en el constructor de cada controlador haces una llamada que se va encargar de controlar al usuario. Algo tipo:


class Principal extends Controller
{
  function Principal()
  {
    parent::Controller();
    $this->adminusuarios->checkUser();
  }

  function index()
  {
   
  }
}

Saludos

Reyvi85

unread,
Jun 30, 2012, 10:43:18 AM6/30/12
to codeignit...@googlegroups.com


El sábado, 17 de octubre de 2009 07:24:16 UTC-4, gogari escribió:
Hola Pasky, yo te voy a dar mi humilde opinión. Lo que suelo hacer es crear una clase que se va encargar de : validar usuario y crear session, comprobar el tiempo de la session y renovarlo por cada interacción, o eliminar la session si ha pasado un tiempo X inactivo, hacer logout cuando el usuario desee salir del sistema,...

Cuando tengas la clase creada, la puedes poner en el autoload.php y en el constructor de cada controlador haces una llamada que se va encargar de controlar al usuario. Algo tipo:

class Principal extends Controller
{
  function Principal()
  {
    parent::Controller();
    $this->adminusuarios->checkUser();
  }

  function index()
  {
   
  }
}

Saludos

Opinión humilde pero sabia, creo, como bien dices que eso es lo ideal, crear una librería que se encargue de hacer todo lo necesario y el los constructorers de cada controlador verifico que se hayan logueado y  sino ->>>>>> FUERA jejjejejeej

edwin_aguiar

unread,
Jun 30, 2012, 8:18:03 PM6/30/12
to codeignit...@googlegroups.com
Aprovecho el hilo para sacarme una duda. Alguno ha tenido problemas con el callback? En mi caso me ha sido imposible hacerlo funcionar. Por ejemplo:
en el controller
$this->form_validation->set_rules('nick_user','NICK (apodo)','required| _callback_check_info');
mas abajo en la funcion (mismo controlador):
 function _check_info($str)
{
$nick_user=$this->input->post('nick_user');
//comprobar que exista
$this->db->where('nick_user', $nick_user);
$query = $this->db->get('users');
//devuelve error
if ($query->num_rows() != 0)
{
$this->form_validation->set_message('nick_user', 'El usuario %s existe.');
echo $nick_user." El usuario existe";
return FALSE;
}
else
{
echo $nick_user." El usuario NO existe";
return TRUE;
}
} //end subfunction 

Los "echo" del condicional son a los efectos de ver si pasa algo, porque simplemente NO LLAMA a callback, pero si lo incluyo como una funcion aparte (por ejemplo en la vista) funciona correctamente. Las demas reglas funcionan todas, incluyendo alpha_space que no la tenia documentada en el manual pdf ni en la ayuda html (versiones actuales)
Agradezco cualquier sugerencia 
Cordiales saludos 

diego

unread,
Jun 30, 2012, 11:47:03 PM6/30/12
to codeignit...@googlegroups.com
la regla is_unique no hace justamente lo que queres?


edwin_aguiar

unread,
Jul 1, 2012, 10:43:56 AM7/1/12
to codeignit...@googlegroups.com
Gracias Diego, no la conocia a dicha regla, de hecho no la tengo documentada en el manual, me fijo y te cuento; igualmente algo pasa porque no llama a CALLBACK.
Un cordial saludo

edwin_aguiar

unread,
Jul 1, 2012, 10:52:30 AM7/1/12
to codeignit...@googlegroups.com
Gracias Diego! En efecto, la regla "is_unique[tabla.campo]" funciona estupendamente. Gracias a tu aporte rastree en el manual online un parrafo en donde se la menciona y de lli la aplique con exito. Lamentablemente en la descripcion de reglas se ha omitido, tal como "alpha_space" por ejemplo. CReo que estaria bueno si vamos hallando estas cositas las publiquemos porque realmente ahorran mucho esfuerzo y hacen del trabajo algo mas ameno.

De todas maneras aun no puedo hacer que reaccione el callback, nuevamente gracias
Reply all
Reply to author
Forward
0 new messages