Sistema de Usuarios (Tercera parte): Usando la clase
Siguiendo la clase anterior (dónde construimos la clase Centinela), hoy toca acabar el sistema, creando la interfaz web para que los usuarios puedan registrarse, loguearse, desloguearse y acceder (o no) a secciones privadas.
Antes de empezar, deberíamos tocar algo de la configuración: ya que la clase centinela la cargaremos en la gran mayoría de veces, le diremos que nos la cargue siempre para mayor comodidad. Por lo que iremos a config/autoload.php y pondremos algo así como:
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your system/application/libraries folder.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'session', 'xmlrpc');
*/
$autoload['libraries'] = array('database', 'session', 'centinela');
Una vez tenemos hecho esto, procederemos a crear las diferentes partes de la web dónde usaremos la clase.
Registro de usuarios
Esta es la parte mas básica de todo esto ya que no tiene "nada que ver" con la clase que hemos creado, ya que se trata de una simple inserción en base de datos. También comprobaremos que el nick no este usado por otro usuario.
function registrar()
{
//cargo la libreria
$this->load->library('validation');
//aplicamos reglas
$reglas['nick'] ="trim|required|callback__check_user";
$reglas['mail'] ="trim|required|valid_email";
$reglas['clave'] ="trim|required|matches[r_clave]";
$reglas['r_clave'] ="trim|required";
$this->validation->set_rules($reglas);
//damos nombres
$campos['nick'] ="Nick";
$campos['mail'] ="Mail";
$campos['clave'] ="Clave";
$campos['r_clave'] ="Repetir clave";
$this->validation->set_fields($campos);
//delimitadores
$this->validation->set_error_delimiters('<span class="error">', '</span><br />');
//si hay error o es la primera vez que ejecutamos
if(!$this->validation->run())
{
$this->load->view("cabecera");
$this->load->view('usuarios/registrar');
$this->load->view("pie");
}
//todo correcto
else
{
$this->db->query("INSERT INTO `usuarios` (`nick`, `clave`, `mail`, `nivel`) VALUES (?,?,?,'1')", array($_POST['nick'], sha1($_POST['clave']), $_POST['mail']));
redirect("usuarios/index/reg_ok");
}
}
//Callback comprobacion de usuario
function _check_user($nick)
{
//comprobar que exista
$this->db->where('nick', $nick);
$q = $this->db->get('usuarios');
//devuelve error
if ($q->num_rows() == 1)
{
$this->validation->set_message('_check_user', 'El usuario %s esta elegido, elige otro.');
return FALSE;
}
else
{
return TRUE;
}
}
Lo unico a comentar es lo del callback. Con la clase validation (que ya hablamos en un articulo anterior) podemos establecer unas reglas, las cuales las podemos ver en la User_Guide, pero aparte de las que ya están creadas nosotros podemos crear las nuestras, que no serán otra cosa que una llamada a una función que devolverá TRUE/FALSE.
En la que he creado aquí arriba lo único que hace es comprobar que no exista el usuario. Fijaros que la función empieza con un _ que denota que sera una función privada y solo sera accesible desde la clase (y no desde la url). Para llamar esta función, en la validación pondremos como una regla más "callback_" + función; en nuestro caso "callback__check_user" (fijaros que hay dos "_"). Aparte de esto también hay que poner en la función esto: $this->validation->set_message('_check_user', 'El usuario %s esta elegido, elige otro.');, para que en caso de no superar esa validación nos suelte el mensaje (%s esto lo substituirá por lo que hayamos puesto en el campo del "nick" en el formulario).
Login
Esta es la más importante, ya que aqui usamos la clase Centinela, aunque no tiene nada de dificil ya que en su momento creamos una función login dónde le pasaremos el nick y la clave, para que compruebe:
function login()
{
//cargo la libreria
$this->load->library('validation');
//aplicamos reglas
$reglas['nick'] ="trim|required";
$reglas['clave'] ="trim|required";
$this->validation->set_rules($reglas);
//damos nombres
$campos['nick'] ="Nick";
$campos['clave'] ="Clave";
$this->validation->set_fields($campos);
//delimitadores
$this->validation->set_error_delimiters('<span class="error">', '</span><br />');
//si hay error o es la primera vez que ejecutamos
if(!$this->validation->run())
{
$this->load->view('cabecera');
$this->load->view('usuarios/login');
$this->load->view('pie');
}
//todo correcto
else
{
$nick = $_POST['nick'];
$password = sha1($_POST['clave']);
$recordar = FALSE;
$centinela = new Centinela(FALSE);
if($centinela->login($nick, $password, $recordar))
redirect('usuarios/index/log_ok');
else
redirect('usuarios/login/error_ok');
}
}
Tal y como os habréis dado cuenta, es muy sencillo. Solo ha sido necesario hacer una llamada a la función login.
Logout
Aquí solo hay que llamar a la función logout.
function logout()
{
$centinela = new Centinela(FALSE);
$centinela->logout();
redirect("usuarios/index/log_off");
}
Sección privada
En esta parte haré una demostración de como usar la clase Centinela para verificar que un usuario esta logueado y que puede acceder (o no) a la sección. También veremos como sacar la información, tal como el nick, mediante la clase.
Esto sería el view:
< ?php $centinela = new Centinela(); if(!$centinela->check(0, FALSE)): ?> <p>Lo siento, esta sección es para usuarios registrados.</p> < ?php else: ?> <p>Hola < ?=$centinela->getNick()?>!<br />Esto es una sección privada de la web.</p> < ?php endif; ?>
Finalizando
Pues qui ha terminado todo el tutorial del Sistema de Usuarios. Cómo ya comenté, esto era simplemente una introducción, una pauta a un sistema más complejo y preparado para usarse en casos reales. Por lo que si tenéis intención de usarlo aquí tenéis algunas recomendaciones.
- La librería de Sessions que lleva por defecto CodeIgniter no es muy segura, por lo que os recomendaría que usareis alguna alternativa que os proponen.
- Aunque hay un tercer parámetro en la función login que es lo de "recordad" típico, no esta implementado. Deberíais hacer uso de cookies para que un usuario que elija recordar su sessión, al volver a la web siga registrado.
Para finalizar aquí tenéis la DEMO funcional de todo este taller, y en ella misma os podréis bajar el código.
Podeis bajaros el código ya que la DEMO no esta operativa. [ codigo ]
¿Te gustó este artículo?
Aún no hay trackbacks.

10 agosto, 2008 - 16:58
Genial.
Que mas se puede pedir . Gracias por todo.
13 agosto, 2008 - 22:03
Excelente…!!
Gracias!
13 septiembre, 2008 - 01:49
Haría falta colocar esto
validation->error_string; ?>
en la vista registrar.php antes del formulario, para que muestre los errores de validación, excelente tutorial…
Saludos
13 septiembre, 2008 - 01:50
mmm… no aparecio completo :
validation->error_string; ?>
13 septiembre, 2008 - 01:55
Una pregunta, podria usar tu codigo y hacerle unos arreglos como validacion personalizada, o repoblando el formulario en caso de error, etc y ponerlo en mi blog? obviamente indicando las fuentes.
Saludos
13 septiembre, 2008 - 22:59
#nucklear
Si por supuesto ;)
25 septiembre, 2008 - 03:36
holas me sale un erro de base de datos cuando se quiere logear
erro de la base de datos encriptacion o algo si
una ayudita porfavor
saludo cristian
25 septiembre, 2008 - 03:39
perdon otra pregunta porque hay codigo que realiza consultas ala base de datos, en el CONTROLADOR usuarios.php,,, no es esta tarea de un MODELO,
felicidades por el trabajo muy bueno gracias..
que puede estar en un controlador a parte de cooridnar entre las VISTAS y el MODELO???
25 septiembre, 2008 - 14:39
Las consultas a la bd, puede estar en donde quieras, incluso en las vistas, no es requisito indispensable que sea en un modelo, aunque eso desvirtue el concepto, pero cada uno es libre de ponerlo donde se le ocurra si eso hace mas facil, la explicacion de tu codigo.
Es la flexibilidad que tiene Codeigniter.
Saludos.
1 octubre, 2008 - 17:04
Hola!
Acabode encontrar este tutorial, me parece muy bueno. Lo único es que nunca he probado CodeIgniter. Como puedo una DEMO como la que has montado tú, pero en mi localhost?
Muchísimas gracias!
2 octubre, 2008 - 13:26
Muy bueno para aprender, pero tengo un par de dudas:
¿para qué el código de
——————————————–
this-validation-set_message(‘_check_user’, ‘El usuario %s ya existe, elige otro.’)
——————————————–
si nunca es usado?
Porque cuando intento registrar 2 veces el mismo nick me devuelve a la pantalla de login SIN DAR información.
Y cuando repito el alta del mismo nick si pongo
——————————————–
echo $this-validation-error_string;
——————————————–
como dice nucklear (13 de agosto) en vez de ponerme que
‘El usuario ayukawaa esta elegido, elige otro.’
me pone
‘El usuario Nick esta elegido, elige otro.’
He revisado el código, pero no sé donde cambiarlo pues no entiendo muy bien la función del callback.
¿Y como hago para que me salgan el resto de errores de validación (dejar nick en blanco, …)?
gracias
2 octubre, 2008 - 19:45
Si, tienes razón, eso fue un despiste :) Podéis arreglarlo sustituyendo por esto:
—————
$this->validation->set_message(‘_check_user’, ‘El usuario ‘.$nick.’ esta elegido, elige otro.’);
—————
28 octubre, 2008 - 06:44
Hola excelente ayuda para los codeignitomaniacos jaja
Porque cuando una vez que apreto logout y me salgo de la “sesion”, cuando apreto el boton atras del Explorador(Internet explorer en mi caso) vuelve al mismo mensaje, no se supone que hize un sess_destroy()?????????en logout??????
gracias saludos
28 octubre, 2008 - 11:24
Si, porque te carga el cache de esa pagina. Si le das a actualizar, veras que te saldrá como que no puedes entrar. Para evitarlo puedes usar el meta de html para que no guarde cache.
29 octubre, 2008 - 17:10
Hola Lagarto, perdon la ignorancia pero…. como se hace eso
29 octubre, 2008 - 19:07
Prueba aqui (primera pagina en google), mirate lo de Cache Control y Expires.
http://www.i18nguy.com/markup/metatags.html
31 octubre, 2008 - 01:53
Lagarto
Primero felicitarte por el tuto, es simplemente EXCELENTE!
Luego quiero preguntarte, cuando vos decís “esto era simplemente una introducción” te referís a que le faltarían mas funcionalidades o a que es inseguro usar un sistema de usuario que trabaje como este? te pregunto porque he analizado diferentes sistema de usuarios de CI (auth, CL auth, redux), específicamente las funciones de login y check, y en definitiva todas funcionan similarmente, verificando que este algún valor en la session.
La ultima es saber si tenes algún ejemplo con el “recordar” funcionando.
Desde ya muchas gracias y felicitarte nuevamente.
NB.
31 octubre, 2008 - 11:02
Mas que funcionalidades, tal y como explico en el final del articulo, habría que “substituir” la librería session por alguna mas segura. Por todo lo demás le haría falta algunas funcionalidades.
Quizá podría hacer otro artículo aprovechando con lo de recordar y las “cookies”, que creo que no he hablado aun, así mato dos pajaros de un tiro.
De todas maneras la cosa seria, que si el usuario marca lo de recordar, le guardamos una cookie con sus datos de login. Si este usuario vuelve y no tiene activadas las session pero si la cookie, miraríamos si los datos de esa cookie son buenos y lo logueariamos (es decir le crearíamos las variables session).
31 octubre, 2008 - 22:59
Lagarto.
Gracias por la respuesta, solo quiero hacerte una pregunta. Estoy probando los conceptos aprendidos en el tuto y me doy cuenta que cuando cargo datos por medio de $CI->session->set_userdata(‘item’,'data’) esto me genera una cookie, por lo que el usuario siempre es “recordado”, no entiendo como genero lo que en php puro seria una variable del tipo $_SESSION para los usuario que no quieren ser recordados.
Estoy usando CI 1.7 con su la librería session.
Abrazo y gracias.
NB.
3 noviembre, 2008 - 19:04
Si, las Session de CodeIgniter en realidad son cookies, que emulan el funcionamiento nativo de las Session de PHP pero de una manera que ofrecen mas flexibilidad.
Si quieres trabajar con el “recordar” del login mírate la clase de cookies.
22 noviembre, 2008 - 17:17
muchas gracias, me fue de mucha utilidad.
26 febrero, 2009 - 09:07
Hola Lagarto,
Soy iniciado en esto del CI y no he podido terminar el tutorial.
Me he perdido en la parte final.
No me he quedado claro adonde poner las funciones de esta tercera parte.
Por otro lado hay una llamada de estos tres archivos del view:
$this->load->view(“cabecera”);
$this->load->view(‘usuarios/registrar’);
$this->load->view(“pie”);
pero igual no estoy seguro que variables coger en cada uno de ellos.
Para poner la cosa más dramática aún, el link de la DEMO funcional ya no está activo, así que no podré confirmar lo que me falta.
Si embargo el tutorial tiene una estructura y un seguimiento que me será útil para utilizar en otros proyectos, y quizás pueda volver más tarde ya con más conocimientos y lograr terminarlo.
Si puedes actualizar el link de la DEMO sería de maravilla.
Gracias por tu blog y tu dedicación a no querer programar.
Pasaré por aqui más veces, seguro.
Valdemar
26 febrero, 2009 - 09:26
Bueno la DEMO la quite por unos problemas que tuve cuando me “hackearon” el blog, aún asi te porpongo que te bajes el codigo que seguro que te viene muy bien, si sigues teniendo dudas, no dudes (valga la redundancia) de volver a postear.
PD: he puesto el link de descargas en el mismo articulo, para que todos los usuarios que lleguen ahi lo vean.
26 febrero, 2009 - 13:21
Wow… Gracias por tu respuesta tan pronto!
He bajado los archivos y así ya tengo bastante más claro de las estrutura que has utilizado.
Perfecto!
Muy bueno. Otra vez gracias!
(Si tengo dudas ya te molestaré un poco más ;-) )
…y felicidades por el nuevo diseño más limpio, principlamente para las lineas de codigo.
28 abril, 2009 - 20:04
Hola, solo una consulta, veo que los accesos a la BD lo haces en el controlador. es eso correcto ? lo mejor seria hacerlo en un modelo ?
Saludos
29 abril, 2009 - 08:53
Por lo general se recomienda separar la lógica de las aplicaciones, de manera que consultas a BD “deberían” hacerse en el modelo, pero a diferencia de otros MVC mas estrictos (por ej. CakePHP), CodeIgniter nos da total libertad para organizar el código tal y como queramos.
Como comento en un par de ocasiones, esto son simples tutoriales introductorios para hacerse una idea rápida del concepto, si quisiéramos perfilar una aplicación para que fuese “real”, esa seria una de las cosas que estaría bien cambiar.
De todas maneras gracias por el apunte :)
11 mayo, 2009 - 06:12
me tengo que loguear dos veces para poder ingresar. Por que puede pasar esto? a alguien mas le pasó lo mismo?
16 agosto, 2010 - 16:29
Hola yo soy un poco nueva en esto.. pero encontre demasiado util tus tutoriales, una consulta sobre esto es, como seria entonces el htm o html, para que se registren? tendrian que los campos tener alguna variable o algo asi? .
27 septiembre, 2010 - 00:05
Hola lagarto, estoy entrando a esto del mundo del CodeIgniter y he seguido muy detenenidamente tu tutorial, del cual he aprendido mucho en poco tiempo.
Pero quisiera que me aclararas lo que dice nuklear de la validación del formulario de registro, por que no he podido lograr hacer aparecer el listado de errores. He mirado login.php pero es totalmente diferente lo que verifica.
Si puedes postear el código que hay que añadir para que aparezca el error seria muy bueno…. gracias
27 septiembre, 2010 - 00:16
Buenas Jose, yo te animo a que reformules tu duda en el foro que habilité hace unos días: http://foro.noquieroprogramar.com/
Así te podremos ayudar entre todos y tu duda servira seguro a muchos otros!
Saludos.
27 septiembre, 2010 - 01:54
Hola de nuevo lagarto… ya lo solucione… todo esta en dormir un rato y observar mejor…
Por si acaso aca esta el codigo
validation->error_string;?>
27 septiembre, 2010 - 01:55
voy a intentar de nuevo dejando unos asteriscos para que no corte el codigo
validation->error_string;?>
habria que eliminar los asteriscos
27 septiembre, 2010 - 02:04
deje un post en el foro con la correciion ya que por aca no se pudo
el link es el siguiente… espero que no lo borre,,
http://foro.noquieroprogramar.com/viewtopic.php?f=2&t=5
20 octubre, 2010 - 03:35
Hola una pregunta tu que libreria de sesiones usas porque a mi me manda errores con el centinela y dice lo de las sessiones supongo que sera por qu usas una libreria diferente no se si funcione usar OB session.
Buen dia espero tu respuesta lagarto buen tuto
20 octubre, 2010 - 04:15
Pues creo recordar que en esa librería uso las sessions que vienen por defecto con CodeIgniter. No será que tienes malfuncionando algo en tu servidor?
21 octubre, 2010 - 05:49
Muchisimas gracias ya lo aregle tenia un problema absurdo algo sencillo nada de relevante jejejejeje de esos errores de cansancio
Gracias por la pronta respuesta.
Buen dia
6 enero, 2011 - 01:31
El tutp esta bueno solo que hay algunos puntos oscuros, por ejemplo como nombrar cada archivo, el segundo la ruta para llamar la aplicacion ldentro de mi localhost
17 junio, 2011 - 12:57
Estoy intentando probar la libreria, pero no se como hacer la llamada desde el navegador.Gracias de antemano
17 junio, 2011 - 12:59
No se llama desde el navegador, se tiene que usar desde los controladores, modelos o vistas de CodeIgniter. Leete todo el tutorial entero y lo entenderás mejor.
Saludos.
5 diciembre, 2011 - 00:16
Me gustaría usar el sistema de login en mi web, podrías explicar como hacer la parte de recordar por favor o enviarme un ejemplo? soy nueva en C.I. Muchas gracias por tu ayuda!!!