/** * 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'); } }