Esta hecho en capas...
Controlador Código PHP:
<?php
Class Login extends Controller {
var $intentos_max = 5;
var $fecha_ultimo_intento;
var $fecha_actual;
var $tiempo_espera = 300; //en segundos
function Login() {
parent::Controller();
$this->load->model("auth_model");
session_start();
if ($_SESSION['intentos'] == FALSE) //Si accedemos por primera vez
$_SESSION['intentos'] = 1;
}
function index() {
$this->load->view('loginForm');
}
function _checkUser($str) {
$status = $this->auth_model->checkUser($str);
if ($status == FALSE) {
$this->form_validation->set_message("_checkUser", "No existe el nombre de usuario indicado, o aún no ha sido agregado como empleado. Le quedan ".($this->intentos_max - $_SESSION['intentos'])." intentos.");
return FALSE;
} else {
return TRUE;
}
}
function _checkPass($user, $pass) {
$status = $this->auth_model->checkPass($user, $pass);
if ($status == FALSE) {
return FALSE;
} else {
return TRUE;
}
}
function _passError() {
$this->form_validation->set_message("_passError", "Contraseña incorrecta. Le quedan ".($this->intentos_max - $_SESSION['intentos'])." intentos.");
return FALSE;
}
function _attempError() {
$this->form_validation->set_message("_attempError", "Ha llegado al limite de los intentos. Pruebe de nuevo en 5 minutos.");
return FALSE;
}
function do_login() {
$user = $this->input->post('user', TRUE);
$pass = $this->input->post('pass', TRUE);
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
//Checkeamos los intentos
if ($_SESSION['intentos'] != FALSE && $_SESSION['intentos'] >= $this->intentos_max) {
if ($_SESSION['fecha'] != FALSE) { //Si estamos intentando luego del maximo de intentos
//comprobamos si transcurrio el tiempo de espera
$this->fecha_actual = time();
$transcurrido = $this->fecha_actual - $_SESSION['fecha'];
if ($transcurrido >= $this->tiempo_espera) {
session_destroy();
redirect(login);
}
} else {
$this->fecha_ultimo_intento = time();
$_SESSION['fecha'] = $this->fecha_ultimo_intento;
}
$this->form_validation->set_rules('user', 'Usuario', 'callback__attempError');
} else {
//Seteamos los rules para user y pass
$this->form_validation->set_rules('user', 'Usuario', 'callback__checkUser');
$passcheck = $this->_checkPass($user, $pass);
if ($passcheck == FALSE)
$this->form_validation->set_rules('pass', 'Contraseña', 'callback__passError');
}
if ($this->form_validation->run() == FALSE) {
$_SESSION['intentos'] = $_SESSION['intentos'] + 1;
$this->load->view("loginForm");
} else {
$this->auth_model->login($user, $pass);
//echo $this->db->get_user();
redirect('inicio');
}
}
}
?>
Modelo (acceso a BD) Código PHP:
<?php
Class Auth_model extends Model {
function Auth_model (){
parent::Model();
$this->load->database();
}
/*
* Se hace una doble verificacion
* Primero: averiguo si el usuario esta en la BD
* Segundo: averiguo si el usuario esta en la tabla empleados
*/
function checkUser($str) {
$this->db->select('usename');
$this->db->from('usuarios');
$this->db->where('usename', $str);
$count = $this->db->count_all_results();
if ($count == 0) {
return FALSE;
} else {
$this->db->select('emp_codempleado');
$this->db->from('empleados emp');
$this->db->join('usuarios us', 'emp.emp_codempleado = us.userid');
$this->db->where('us.usename', $str);
$count2 = $this->db->count_all_results();
if ($count2 == 0)
return FALSE;
else
return TRUE;
}
}
function checkPass($user, $pass) {
$sql = "select count(*) as count from usuarios where usename =".$this->db->escape($user)." and password = md5(".$this->db->escape($pass).")";
$count = $this->db->query($sql)->row()->count;
if ($count == 0) {
return FALSE;
} else {
return TRUE;
}
return TRUE;
}
function getEmpleadoData($codempleado) {
$this->db->where('emp_codempleado', $codempleado);
return $this->db->get('empleados')->row();
}
function login($user, $pass) {
//Genero la informacion para el DNS
$dns = 'mysql://user:pass@server/bd'; //Esto lo pongo de forma explicita
//Genero los datos que iran a la session
session_start();
$_SESSION['token'] = md5($user.$pass);
$values = array (
'userid' => $user,
'password' => md5($pass),
'dns' => $dns,
'token' => md5($user.$pass),
);
//print_r($values);
$this->session->set_userdata($values);
//Creo que la nueva conexion
$this->db->close();
$this->load->database($dns, FALSE, TRUE);
}
function logout() {
session_start();
$values = array (
'userid' => '',
'password' => '',
'dns' => '',
'token' => '',
);
$this->session->unset_userdata($values);
$this->load->database();
session_destroy();
}
}
?>
Vista (form de login) Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Inicio de Sesión » Casa Tita S.R.L.</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<?php
echo link_tag("src/styles/style.css");
?>
</head>
<body>
<div id="container">
<div id="header">
<?php echo img("src/images/logo.jpg"); ?>
Sistema Administrativo
</div>
<div id="content">
<div class="heading">
<h1>Inicio de sesión</h1><hr/>
</div>
<?php
//Muestro errores en caso de que haya
echo validation_errors();
//Abro el tag form
echo form_open("login/do_login");
//Asigno atributos
$attruser = array(
'name' => 'user',
'id' => 'user',
'class' => 'textfield required',
'value' => $value['user']
);
$attrpass = array(
'name' => 'pass',
'id' => 'pass',
'class' => 'textfield required',
'value' => $value['pass'],
'type' => 'password',
);
$attrsave = array(
'name' => 'guardar',
'id' => 'guardar',
'class' => 'btn_save',
'value' => 'Entrar',
);
//Abro el tag fieldset
echo form_fieldset('Acceso de Usuarios');
//Campos
echo form_label("Usuario", "user");
echo form_input($attruser);
echo form_label("Contraseña", "pass");
echo form_input($attrpass);
//Botones
echo "<br/>";
echo form_submit($attrsave);
echo form_fieldset_close();
echo form_close();
$this->load->view("src/footer");
?>