Sistema de Logueo de Usuarios en PHP & MySQL

En esta oportunidad les traigo una clase perteneciente al futuro framework PHP CodeFlyer, que nos permitirá autentificar usuarios de manera rápida y segura.

Es una clase que construí hace tiempo y que vengo usando hace varios años, pero la he ajustado para que todo el mundo pueda usarla.

Este artículo se basa en el logueo y autentificación de usuarios y no en la creación o registro de usuarios.

1. Instalando

Primeramente debemos crear la tabla en donde se almacenarán todos los usuarios de nuestro sitio. Para esto basta con ejecutar la siguiente consulta en tu base de datos:

CREATE TABLE `login` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `privilege` int(6) NOT NULL default '0',
  `cookie` binary(32) NOT NULL,
  `session` binary(32) NOT NULL,
  `lastactive` date NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Para usos prácticos podemos crear nuestro usuario desde MySQL:
Usuario: admin
Contraseña: admin

INSERT INTO `login` VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 1,'','','');

(El md5 de “admin” es “21232f297a57a5a743894a0e4a801fc3″)

Una vez creada la tabla “login” debes copiar el archivo login.php a tu carpeta de proyectos.

2. Inicializando la clase

El siguiente paso será crear un archivo llamado “config.php” en donde iniciaremos la clase login, y luego incluiremos este config.php en todos nuestros archivos del proyecto. Completa los campos ‘database’, ‘username’ y ‘password’ con los datos de acceso de tu base de datos MySQL:

config.php:

<?PHP
  include('login.php');

  $login = new login(array(
    'database' => 'dbexample',
    'table'    => 'login',
    'username' => 'root',
    'password' => '1234'
  ));
?>

3. Autentificando usuarios

Para loguear a un usuario usamos la función login:

    if($login->login('usuario', 'contraseña'))
    {
       // Welcome!
    }

Entonces de esta manera podemos crear nuestro formulario de inicio de sesión, al que llamaremos index.php

La idea es mostrar el formulario a los usuarios ‘no logueados’, y redirigir hacia “protected.php” a los usuarios correctamente logueados:

index.php:

<?PHP
  include('config.php');

  if ($_POST['submit'])
  {
    if($login->login($_POST['usn'], $_POST['pwd']))
    {
      header('location: protected.php');
    }
    else
    {
      echo "<strong>Login error</strong>";
    }
  }

  if (!$login->logged()) : ?>
    <form method="post">
      <p><label>Username: <input type="text"     name="usn" value="" /></label></p>
      <p><label>Password: <input type="password" name="pwd" value="" /></label></p>
      <p><input type="submit" name="submit" /></p>
    </form>
  <?PHP
  else:
    header('location: protected.php');
  endif;
?>

Entonces ya tenemos una manera para autentificar usuarios, pero ahora debemos proteger aquellas páginas que sólo deben ser vistas por usuarios registrados. Para ello vamos a crear una página protegida llamada “protected.php”:

protected.php:

<?PHP
  include('config.php');
  if (!$login->logged())
  {
    header("location: index.php");
    die();
  }
?>

<strong>Este contenido es privado</strong> <a href="logout.php">Salir de mi cuenta</a>

La función logged() nos devuelve true si el usuario está autentificado, o false si el usuario intenta ingresar con una sesión inválida.

Tán sólo nos falta un archivo más llamado “logout.php” que usaremos para destruir la sesión:

logout.php:

<?PHP
  include('config.php');

  $login->logout();
  header("location: index.php");
?>

4. Resumen de funciones

Entonces a modo de resumen podemos usar las siguientes funciones:

// Creamos la clase, enviando los datos de acceso a la base de datos MySQL:
$login = new login(array(
    'database' => 'dbexample',
    'table'    => 'login',
    'username' => 'root',
    'password' => '1234'
));

// Logueamos al usuario "username" con la contraseña "password"
$login->login("username", "password");

// Opcionalmente se puede utilizar un tercer parámetro bool, para utilizar cookies
// y recordar la visita del usuario, aún después de cerrar el navegador:
$login->login("username", "password", true);

// Preguntar si el usuario está correctamente autentificado. Devuelve false en caso de haber error:
$login->logged();

// Cerrar y destruir la sesión:
$login->logout();

5. Download

Haremos cosas interesantes con esta clase mas adelante :roll:

Este artículo contiene los siguientes archivos:

Raul says:

Holas, muy bueno tu blog me gusto mucho entre a casi todos tus articulos me gustaron mucho >.< jej

primero empese por utilizar esto en mi proyecto, pero te cuento que estoy usando una capa de abtraccion de datos me PEAR el MDB2 ya la modifique todo lo respectivo a la base de datos.

Pero por algun motivo no me deja mostrar el form de login y me sale este mensaje

Fatal error: Call to a member function query() on a non-object in D:\GestionPacientes\login2\login.php on line 257

y ese error sale porque creo que no es correcta la consulta hise un echo y esta es la consulta que sale despues de las condicionales IF o else

SELECT * FROM login WHERE (username = ”) AND (session = ‘ume3e06o04mpa4uhn056kr3in6′) LIMIT 1;

en conclusion sale el query del else.

Espero que me puedas ayudar, mientras estare implementando sexyForms xD

    Eduardo says:

    Aparentemente es un error en tus modificaciones, no de la clase. No puedo ayudarte porque yo no soy el que ha metido mano :roll: y no se que cambios podrías (o tendrías que) haber hecho.

    Saludos.

    Este comentario te ha servido? y colabora con el blog
    Reply
Breaks says:

SELECT * FROM login WHERE (username = ”) AND (session = ‘ume3e06o04mpa4uhn056kr3in6′) LIMIT 1;

Porque el USERNAME=” <—- tiene esa comilla? O.O

NewDanger says:

Implementado en un sistemita que estoy armando. Anda joya! modifike nomas la parte ke dice:

header("location: index.php");

por una en JS para ke no tire el error:

*Warning*: Cannot modify header information - headers already sent...

lo cambie por esto:

NewDanger says:

perdon, ahi salio los tags de JS, lo cambie por esto:

  ?>
      <script typte="text/javascript">
	  window.location.href = 'index.php';
	  </script>
      <?
Lord Sun says:

Hola me podrias ayudar de favor como puedo hacer o con que librerias o aplicacion js para que me aparesca un cuadro contenedor donde se me presenten los “ultimos comentarios” como el que se encuentra en esta pagina en la parte de abajo…. Muchas gracias de antemano si me puedes ayudar… Y una exelente apgina y proyectos

Abdelyazid says:

Interesante el codigo, pero solo funciona con versiones inferiores a PHP 5.0.0, para versiones superiores alguna idea?

    Jair says:

    Hola.

    Sera que por eso no me funciona en lampp.
    No me deja logear, de la pantalla de logeo no pasa y pongo bien los datos para entrar.
    Lo probe con xampp 1.6.8 y probe el mismo codigo en lampp que viene en ubuntu server 12.4 y nada.
    Instale xampp, en ubuntu server y me daba errores en la clase login, en las funciones donde hay http.

    Saludos y a ver si me puedes ayudar.

Carlos Daniel Estrad says:

Muy bueno el sistema, solo me gustaria que me respondieras una duda, quiero saber como poner los privilegios, con este sistema como se haria?? porfavor espero me contestes lo antes posible, muchas gracias

Marissa says:

Hola me parece perfecto tu ejemplo….me llama la atención que manejas lo de cookie, session y lastactive….me interesa….pero como puedo manipularlo o usarlo, para que despues de cierta inactividad los saque o determinar el tiempo que durará la sesión.

Gracias y saludos!!!

Marissa says:

Hola he probado el ejemplo tal cual y me salen todos estos errores. Sabes porqué??

Strict Standards: Redefining already defined constructor for class login in C:\xampp\htdocs\sesiones\login.php on line 302

Notice: Undefined index: host in C:\xampp\htdocs\sesiones\login.php on line 305

Notice: Undefined index: submit in C:\xampp\htdocs\sesiones\index.php on line 4

Notice: Undefined index: cf_login_cookie in C:\xampp\htdocs\sesiones\login.php on line 236

Notice: Undefined index: serial in C:\xampp\htdocs\sesiones\login.php on line 242

luis says:

Funciona perfecto, solo que la duracion de la sesion es un drama si vuelvo sobre una pag bajo el login debo volver a autenticar… gracias por compartir tu trabajo

Franco says:

La verdad que te agradezco, implemente esto en un sistema que estoy haciendo y funciona perfecto. Muchas gracias.

Juan says:

Muy buen aporte amigo, la verdad es que es el unico sistema que me ha funcionado. pero tengo el siguiente problema, por que cuando inserto un usuario usando la misma cadena de md5 y todo igual que la cadena admin que tienes arriba y yo solo moifico el admin por el nuevo usuario no me deja entrar…..

y la otra pregunta tienes algun formulario de registro para esta explicacion? gracias.

Jair says:

Hola.

Sera que por eso no me funciona en lampp.
No me deja logear, de la pantalla de logeo no pasa y pongo bien los datos para entrar.
Lo probe con xampp 1.6.8 y todo bien y probe el mismo codigo en lampp que viene en ubuntu server 12.4 y nada.
Instale xampp, en ubuntu server y me daba errores en la clase login, en las funciones donde hay http.

Saludos y a ver si me puedes ayudar.

luis says:

Sigo con el problema de los tiempos de las cookies… por algun motivo mueren a la primera entrada y al volver sobre las paginas bajo el code devo volver a autenticar…

luis says:

Para el asuto de la cookies será que hay que modificar algo aca? ando perdido….

// Destruir sessión.
public function logout()
{
$_SESSION['cf_login_username'] = ”;
$_SESSION['cf_login_cookie'] = 0;
$this->create_cookie(‘cf_login_cookie’, ”, time() – 3600);
mysql_query(“UPDATE {$this->table} SET session=’”.strtoupper(md5(time())).”‘, cookie=’”.strtoupper(md5(time())).”‘ WHERE id=’{$this->id}’”, $this->link);

$this->username = ”;
$this->password = ”;
$this->privilege = 0;
$this->id = 0;

None says:
<head><meta http-equiv="Refresh" content="5;url=http://www.cristalab.com"></head>
juan pablo says:

Hola, lo estoy intentando hacer funcionar pero con php 5.3 y no me pasa de la pantalla de logeo.
Otra cuestión ¿Cómo puedo hacer para que el mismo usuario se pueda conectar a la vez desde varios equipos?. GRacias

Gerry says:

Hola muy buen sistema me gusta mucho . pero hay un problema no me funciona y no funka en xammp
MAS SI LO HACE PERFECTAMENTE EN APPSERVER. podrias solucionar ese error porfavor.? de antemano muchas gracias!

fer says:

He probado este codigo en localhost y si funciona muy bien, con appserv, el problema es cuando lo subes a un servidor en mi caso debian, no funciona, solo se queda en el login y aunque ingreso el usuario y contraseña validos no pasa de alli.
Ya he configurado el acceso al servidor correctamente porque en caso de introducir datos incorrectos si me genera error.
Trataré de corregirlo y si ecuentro la solucion la publicare aqui

kangaroo says:

Que modificaciones habría que hacer para que sea compatible con php 5.x ?? Me urge, gracias…