コード例 #1
0
 /**
  *	Lleva a cabo la autentificacion. 
  *	Los fallos se registran con excepciones, en funcionamiento normal no devulve ningun valor
  */
 private function autenticar($id_usuario, $clave = null, $datos_iniciales = null)
 {
     if (toba::proyecto()->get_parametro('validacion_debug')) {
         //Es autologin, no se autentica
         return;
     }
     if (!isset($clave)) {
         throw new toba_error_autenticacion('Es necesario ingresar la clave.');
     }
     $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
     if ($this->invocar_metodo_usuario('es_ip_rechazada', array($ip))) {
         throw new toba_error('La IP esta bloqueada. Contactese con el administrador');
     }
     if ($this->invocar_metodo_usuario('es_usuario_bloqueado', array($id_usuario))) {
         throw new toba_error('El usuario se encuentra bloqueado. Contáctese con el administrador');
     }
     // Disparo la autenticacion
     if ($this->get_autenticacion() != null) {
         $estado = $this->autenticacion->autenticar($id_usuario, $clave, $datos_iniciales);
     } else {
         throw new toba_error_seguridad('No existe la autenticación propuesta');
     }
     if (!$estado) {
         $error = 'La combinación usuario/clave es incorrecta';
         $this->invocar_metodo_usuario('registrar_error_login', array($id_usuario, $ip, $error));
         $proyecto = toba::proyecto()->get_id();
         $cant_max_intentos = toba_parametros::get_intentos_validacion($proyecto);
         if (isset($cant_max_intentos)) {
             $accion_pedida = toba_parametros::get_debe_bloquear_usuario($proyecto);
             $bloquear_usuario = $accion_pedida == '1';
             $lanzar_excepcion = $accion_pedida == '2';
             //Bloqueo el Usuario o IP si la cantidad de intentos supera los esperados dentro de la ventana temporal establecida
             $ventana_temporal = toba_parametros::get_ventana_intentos($proyecto);
             if ($bloquear_usuario || $lanzar_excepcion) {
                 $intentos = $this->invocar_metodo_usuario('get_cantidad_intentos_usuario_en_ventana_temporal', array($id_usuario, $ventana_temporal));
             } else {
                 $intentos = $this->invocar_metodo_usuario('get_cantidad_intentos_en_ventana_temporal', array($ip, $ventana_temporal));
             }
             $supero_tope_intentos_en_ventana = $intentos > $cant_max_intentos;
             if ($supero_tope_intentos_en_ventana) {
                 if ($bloquear_usuario) {
                     $this->invocar_metodo_usuario('bloquear_usuario', array($id_usuario));
                     throw new toba_error_autenticacion("{$error}. Ha superado el límite de inicios de sesion. El usuario ha sido bloqueado.");
                 } elseif ($lanzar_excepcion) {
                     throw new toba_error_autenticacion_intentos("{$error}. Ha superado el límite de inicios de sesion.|{$intentos}");
                 } else {
                     $this->invocar_metodo_usuario('bloquear_ip', array($ip));
                     throw new toba_error_autenticacion("{$error}. La IP ha sido bloqueada.");
                 }
             }
         }
         throw new toba_error_autenticacion($error);
     }
     if ($this->get_autenticacion() != null) {
         $this->contrasenia_vencida = $this->autenticacion->verificar_clave_vencida($id_usuario);
     } else {
         throw new toba_error_seguridad('No existe la autenticación propuesta');
     }
 }