示例#1
0
 /**
  *
  * 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;
 }