/** * * Valida las credenciales de un usuario y regresa un url a donde se debe de redireccionar. * Este m?todo no necesita de ning?n tipo de autenticaci?n. * Si se detecta un tipo de usuario inferior a admin y no se ha llamado * antes a api/sucursal/revisar_sucursal se regresar? un 403 Authorization * Required y la sesi?n no se iniciar?. * Si el usuario que esta intentando iniciar sesion, esta descativado... * 403 Authorization Required supongo * * @param password string La contrasena del usuario. * @param usuario string El id de usuario a intentar iniciar sesion. * @param request_token bool Si se envia, y es verdadero, el seguimiento de esta sesi�n se har� mediante un token, de lo contrario se har� mediante cookies. * @return usuario_grupo int El grupo al que este usuario pertenece. * @return siguiente_url string La url a donde se debe de redirigir. * @return login_succesful bool Si la validaci�n del usuario es correcta. * @return auth_token string El token si es que fue solicitado. **/ public static function Iniciar($password, $usuario, $request_token = null) { //user is not logged in, look for him $user = UsuarioDAO::findUser($usuario, $password); if (is_null($user)) { Logger::warn("===== Credenciales invalidas para usuario {$usuario} ====== "); return array("login_succesful" => false, "reason" => "Credenciales Invalidas"); } //verificamos si la instancia esta activa if (INSTANCE_ACCESS === "0") { return array("login_succesful" => false, "reason" => "Acceso denegado, su instancia esta desactivada"); } //ok user is ok, buscar su usuario en los tokens actuales $sesiones_actuales = SesionDAO::search(new Sesion(array("id_usuario" => $user->getIdUsuario()))); if (sizeof($sesiones_actuales) > 0) { foreach ($sesiones_actuales as $s) { try { SesionDAO::delete($s); } catch (Exception $e) { //Logger::error($e->getMessage()); throw new InvalidDatabaseOperationException($e); } } } //si tiene un token actualmente que es valido, regenerar el token actualizar la fecha y darle el nuevo token $nueva_sesion = new Sesion(); $nueva_sesion->setIdUsuario($user->getIdUsuario()); $nueva_sesion->setAuthToken(self::GenerarAuthToken()); $nueva_sesion->setFechaDeVencimiento(time() + 3600); if (isset($_SERVER["HTTP_USER_AGENT"])) { $nueva_sesion->setClientUserAgent($_SERVER["HTTP_USER_AGENT"]); } else { $nueva_sesion->setClientUserAgent("CLI"); } if (isset($_SERVER["REMOTE_ADDR"])) { $nueva_sesion->setIp($_SERVER["REMOTE_ADDR"]); } else { $nueva_sesion->setIp("CLI"); } try { SesionDAO::save($nueva_sesion); } catch (Exception $e) { throw new InvalidDatabaseOperationException($e); } self::login($nueva_sesion->getAuthToken(), $nueva_sesion->getIdUsuario(), $user->getIdRol()); self::$_current_user = $user; self::$_is_logged_in = true; switch ($user->getIdRol()) { case 0: case 1: case 2: case 3: case 4: $next_url = "g/"; break; case 5: $next_url = "c/"; break; } $r = array("auth_token" => $nueva_sesion->getAuthToken(), "login_succesful" => true, "usuario_grupo" => $user->getIdRol(), "siguiente_url" => $next_url); if ($user->getIdRol() == 5) { $r["detalles_usuario"] = ClientesController::Detalle($user->getIdUsuario()); } return $r; }