Ver Mensaje Individual
  #3 (permalink)  
Antiguo 15/01/2009, 19:39
Avatar de [NiRVaNa]
[NiRVaNa]
 
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: Testeando mi aplicacion de login...

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&uacute;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($dnsFALSETRUE);
        }
        
        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 &raquo; 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");
?>
__________________
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."

Última edición por [NiRVaNa]; 19/01/2009 a las 23:09 Razón: Actualizacion de codigo