Foros del Web » Programando para Internet » PHP »

Keep me logged (mantenerme conectado)

Estas en el tema de Keep me logged (mantenerme conectado) en el foro de PHP en Foros del Web. Hola, tengo un script para logear a un usuario con su correspondiente contraseña. También hay una opción para hacer LOGOUT. El tema es que quiero ...
  #1 (permalink)  
Antiguo 31/12/2010, 07:41
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 14 años, 7 meses
Puntos: 15
Keep me logged (mantenerme conectado)

Hola, tengo un script para logear a un usuario con su correspondiente contraseña.

También hay una opción para hacer LOGOUT.

El tema es que quiero implementar una opción para que aparezca un check y se mantenga logeado la próxima vez que reinicie el ordenador.

Alguien sabe cómo? la teoría supongo que es fácil, el tema es no borrar la cookie que controla el usuario y la contraseña pero... cómo hacerlo?

os pego el código:

Código PHP:
Ver original
  1. /*
  2.  * @script      Sistema de logueo de usuarios
  3.  * @version     0.3.b
  4.  * @date        17 Agosto 2009
  5.  * @copyright   Copyright (c) 2008-2009 - www.codeflyer.org - All Rights Reserved.
  6.  * @author      Eduardo Daniel Sada.
  7.  * @license     MIT ( http://es.wikipedia.org/wiki/Licencia_MIT )
  8. */
  9.  
  10. /* PHP5 required */
  11. if (version_compare(PHP_VERSION, '5.0.0') < 0)
  12. {
  13.     die('The CodeFlyer Framework requires PHP 5.x.x or greater.');
  14. }
  15.  
  16.  
  17. class login
  18. {
  19.     private $mail;
  20.     private $password;
  21.     private $privilege;
  22.  
  23.     private $link;
  24.     private $idprofile;
  25.     private $table;
  26.    
  27.     public $error;
  28.  
  29.   /**
  30.    * Get userdata
  31.    */
  32.  
  33.   public function get($var)
  34.   {
  35.     $var = trim(lcase($var));
  36.  
  37.     if ($var=='privilege')
  38.     {
  39.       $ret = $this->privilege;
  40.     }
  41.     else if ($var=='mail')
  42.     {
  43.       $ret = $this->mail;
  44.     }
  45.     else if ($var=='password')
  46.     {
  47.       $ret = $this->password;
  48.     }
  49.     else
  50.     {
  51.       $ret = false;
  52.     }
  53.     return $ret;
  54.   }
  55.  
  56.  
  57.   public function isadmin()
  58.     {
  59.     return $this->privilege == 1;
  60.     }
  61.  
  62.     public function getdata($data)
  63.     {
  64.     $data = $this->clean(trim($data));
  65.     $query = "SELECT $data FROM {$this->table} WHERE idprofile='{$this->idprofile}' LIMIT 1;";
  66.     if ($result = mysql_query($query, $this->link))
  67.     {
  68.       if ($row = mysql_fetch_assoc($result))
  69.       {
  70.         return $row[$data];
  71.       }
  72.     }
  73.     }
  74.  
  75.   /**
  76.    * Set userdata
  77.    */
  78.     public function modlastlogin()
  79.     {
  80.         mysql_query("UPDATE {$this->table} SET lastactive = NOW() WHERE idprofile = '{$this->idprofile}';", $this->link);
  81.         return mysql_affected_rows($this->link)==1 ? true : false;
  82.     }
  83.  
  84.     public function lastlogin()
  85.     {
  86.         if ($result = mysql_query("SELECT lastactive FROM {$this->table} WHERE idprofile = '{$this->idprofile}' LIMIT 1", $this->link))
  87.         {
  88.             if ($row = mysql_fetch_assoc($result))
  89.             {
  90.                 return $row['lastactive'];
  91.             }
  92.         }
  93.     }
  94.  
  95.     /**
  96.      * Login core
  97.      */
  98.     public function inherit($session)
  99.     {
  100.     session_name(urldecode($session));
  101.     }
  102.  
  103.     public function getSID()
  104.     {
  105.     return "PHPSESSID=".session_id();
  106.     }
  107.  
  108.   public function login($mail, $password, $remember = false)
  109.   {
  110.     $mail = $this->clean($mail);
  111.     $password = md5($password);
  112.     $query    = "SELECT * FROM {$this->table} WHERE mail = '$mail' LIMIT 1;";
  113.  
  114.     if ($result = mysql_query($query, $this->link))
  115.     {
  116.       if ($row = mysql_fetch_assoc($result))
  117.       {
  118.         if ($row['password']==$password)
  119.         {
  120.           return $this->setSession($row, $remember);
  121.           //return $this->id=$values['id'];
  122.          
  123.         }
  124.         else
  125.         {
  126.           $this->logout();
  127.           $this->error = 'pi'; // Password Incorrect
  128.           return false;
  129.         }
  130.       }
  131.       $this->logout();
  132.       $this->error = 'ui'; // mail Incorrect
  133.       return false;
  134.     }
  135.     else
  136.     {
  137.       $this->logout();
  138.       return false;
  139.     }
  140.   }
  141.  
  142.   // Construir la session y la cookie, y guardarlas en la base de datos.
  143.   private function setSession(&$values, $remember = false, $init = true)
  144.   {
  145.     $this->idprofile   = $values['idprofile'];
  146.     $this->mail       = $values['mail'];
  147.     $this->password   = $values['password'];
  148.     $this->privilege  = $values['privilege'];
  149.  
  150.     $_SESSION['cf_login_mail'] = htmlspecialchars($this->mail);
  151.    
  152.     $cookie = md5($values['mail'].date("Y-m-d"));
  153.     if ($remember)
  154.     {
  155.       $this->update_cookie($cookie, true);
  156.     }
  157.  
  158.     if ($init)
  159.     {
  160.       $session = session_id();
  161.       mysql_query("UPDATE {$this->table} SET session='{$session}', cookie='{$cookie}' WHERE idprofile='{$this->idprofile}'", $this->link);
  162.       $this->modlastlogin();
  163.     }
  164.     return true;
  165.   }
  166.  
  167.   private function update_cookie($cookie)
  168.   {
  169.     $this->create_cookie('cf_login_cookie', serialize(array($this->mail, $this->password, $cookie)), time() + 31104000);
  170.   }
  171.  
  172.   public function create_cookie($name, $value='', $maxage=0, $domain='', $path='', $secure=false, $HTTPOnly=false)
  173.   {
  174.     $ob = ini_get('output_buffering');
  175.    
  176.     if ($_SERVER['HTTPS'])
  177.     {
  178.       $secure = true;
  179.     }
  180.  
  181.     // Abort the method if headers have already been sent, except when output buffering has been enabled
  182.     if ( headers_sent() && (bool) $ob === false || strtolower($ob) == 'off' )
  183.     {
  184.       return false;
  185.     }
  186.  
  187.     if (!(bool)$maxage)
  188.     {
  189.       $maxage = time()+3600;
  190.     }
  191.  
  192.     if ( !empty($domain) )
  193.     {
  194.       // Fix the domain to accept domains with and without 'www.'.
  195.       if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
  196.       {
  197.         $domain = substr($domain, 4);
  198.       }
  199.  
  200.       // Add the dot prefix to ensure compatibility with subdomains
  201.       if ( substr($domain, 0, 1) != '.' )
  202.       {
  203.         $domain = '.'.$domain;
  204.       }
  205.  
  206.  
  207.       // Remove port information.
  208.       $port = strpos($domain, ':');
  209.  
  210.       if ( $port !== false )
  211.       {
  212.         $domain = substr($domain, 0, $port);
  213.       }
  214.     }
  215.     else
  216.     {
  217.       // Localhost compatibility
  218.       $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
  219.     }
  220.  
  221.     header('Set-Cookie: ' .rawurlencode($name).'='.rawurlencode($value)
  222.                           .(empty($domain) ? '' : '; Domain='.$domain )
  223.                           .(empty($maxage) ? '' : '; Max-Age='.$maxage)
  224.                           .(empty($path)   ? '' : '; Path='.$path     )
  225.                           .(!$secure       ? '' : '; Secure'          )
  226.                           .(!$HTTPOnly     ? '' : '; HttpOnly'        )
  227.           , false);
  228.     return true;
  229.   }
  230.  
  231.   // Devuelve true si el usuario está logueado. Caso contrario devuelve false.
  232.   // @return bool
  233.     public function logged()
  234.     {
  235.     // Verificar si el usuario contiene una cookie y cargar sus datos.
  236.     $cookie = array();
  237.     if ($_COOKIE['cf_login_cookie'])
  238.     {
  239.       list($cookie['mail'], $cookie['password'], $cookie['serial']) = @unserialize(stripslashes($_COOKIE['cf_login_cookie']));
  240.     }
  241.  
  242.     // Verificar si los datos de la cookie son válidos.
  243.     if ($cookie['serial'] && $cookie['mail'] && $cookie['password'])
  244.     {
  245.       $query    = "SELECT * FROM {$this->table} WHERE (mail = '{$cookie['mail']}') AND (password = '{$cookie['password']}') AND (cookie = '{$cookie['serial']}') LIMIT 1;";
  246.     }
  247.     else
  248.     {
  249.       // Verificar si los datos de session son válidos.
  250.       $mail = $_SESSION['cf_login_mail'];
  251.       $session  = session_id();
  252.       $query    = "SELECT * FROM {$this->table} WHERE (mail = '$mail') AND (session = '$session') LIMIT 1;";
  253.     }
  254.  
  255.  
  256.     if ($result = mysql_query($query, $this->link))
  257.     {
  258.       if ($row = mysql_fetch_assoc($result))
  259.       {
  260.         return $this->setSession($row, false, false); // Log in    
  261.       }
  262.       else
  263.       {
  264.         return false;
  265.       }
  266.     }
  267.     else
  268.     {
  269.       return false;
  270.     }
  271.     }
  272.  
  273.   // Destruir sessión.
  274.     public function logout()
  275.     {
  276.         $_SESSION['cf_login_mail'] = '';
  277.         $_SESSION['cf_login_cookie']   = 0;
  278.         $this->create_cookie('cf_login_cookie', '', time() - 3600);
  279.         mysql_query("UPDATE {$this->table} SET session='".strtoupper(md5(time()))."', cookie='".strtoupper(md5(time()))."' WHERE idprofile='{$this->idprofile}'", $this->link);
  280.  
  281.         $this->mail = '';
  282.         $this->password = '';
  283.         $this->privilege = 0;
  284.         $this->idprofile = 0;
  285.     }
  286.  
  287.   // Limpia la variable de carácteres impuros.
  288.   private function clean($value)
  289.   {
  290.     {
  291.       $value = stripslashes($value);
  292.     }
  293.     $value = mysql_real_escape_string( htmlspecialchars( $value ) );
  294.     return $value;
  295.   }
  296.  
  297.   // Crea la clase y conecta con la base de datos.
  298.   // @param array : ['host']     = 'localhost';
  299.   //                ['table']    = Tabla en donde se almacenan los usuarios
  300.   //                ['mail'] = Nombre de usuario de la base de datos
  301.   //                ['password'] = Password de la base de datos
  302.     public function __construct($array)
  303.     {
  304.     $this->table = $array['table'] ? $array['table'] : 'login';
  305.     $this->link  = mysql_connect( $array['host'] ? $array['host'] : 'localhost', $array['mail'], $array['password'], true );
  306.     if (!$this->link)
  307.     {
  308.       die(mysql_error());
  309.     }
  310.     else
  311.     {
  312.       if (!mysql_select_db($array['database']))
  313.       {
  314.         die(mysql_error());
  315.       }
  316.     }
  317.     mysql_query ("SET NAMES 'utf8'"); // se añadió para evitar problema con el uft8
  318.  
  319.     if (isset($_GET['PHPSESSID']))
  320.     {
  321.       session_id($_GET['PHPSESSID']);
  322.     }
  323.  
  324.     session_start();  // quitado pq no funciona en el servidor
  325.     }
  326.  
  327.     function getMail()
  328.     {
  329.         return $this->mail;
  330.     }
  331.    
  332.     function getPassword()
  333.     {
  334.         return $this->password;    
  335.     }
  336.  
  337.     // function getName()
  338.     // {
  339.         // return $this->firsname;
  340.         // return $this->lastname;
  341.     // }
  342.    
  343. }
  #2 (permalink)  
Antiguo 31/12/2010, 08:01
 
Fecha de Ingreso: diciembre-2010
Ubicación: Rosario, Santa Fe
Mensajes: 326
Antigüedad: 9 años
Puntos: 13
Respuesta: Keep me logged (mantenerme conectado)

En el metodo create_cookie tenes el parametro $maxage que setea el tiempo de expiración de la cookie, así que cuando pones recordar lo único que tenes que hacer (ya que el tema cookies ya lo implementaste) es modificar ese tiempo, poniendo en que fecha (unix time) expira, osea que tendrías que hacer algo así:
time() + 3600, lo cual es 1 hora. La función time nos da la hora actual (unix timestamp) y le sumamos cuantos segundo queremos que dure logueado.
  #3 (permalink)  
Antiguo 01/01/2011, 21:26
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 14 años, 7 meses
Puntos: 15
Respuesta: Keep me logged (mantenerme conectado)

entiendo la explicación areslepra pero no me va, es más, algún parámetro debe chocar con algo porque no me carga la página, sólo el título de ésta cuando le pongo:

time()+3600

he probado a poner un número como el 10000000000000000000000000 y sí que me carga la web pero no surte efecto alguno...
  #4 (permalink)  
Antiguo 04/01/2011, 17:33
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: Keep me logged (mantenerme conectado)

Que tal humanista, por lo que veo, por defecto debería estar logeado 1 hora, esto es asi ?, cuando llamas a login, le pasas el parámetro $remember con valor true ?

Saludos.
  #5 (permalink)  
Antiguo 07/01/2011, 17:40
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 14 años, 7 meses
Puntos: 15
Respuesta: Keep me logged (mantenerme conectado)

hola masterpuppet, pues en buena lógica podría tratarse de $remember pero lo pongo a true en las dos funciones que hay y no va.

No me logea ni una hora ni un minuto. cuando cierro todas las ventanas del Chrome (q es el q uso) y vuelvo a abrir el Chrome, ya me ha sacado.

Etiquetas: conectado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:14.