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
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
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
$this->form_validation->set_rules('nick_user','NICK (apodo)','required| _callback_check_info');
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 errorif ($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
--
---
De-suscripción: codeigniter-spa...@googlegroups.com
Mas Información: http://groups.google.com/group/codeigniter-spanish?hl=es
Antes de responder revisa: http://es.wikipedia.org/wiki/Netiquette
Regístrate en el Censo CI: http://bit.ly/miembroscodeigniteres