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 dice:

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 dice:

    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
    Responder
Breaks dice:

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

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

NewDanger dice:

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 dice:

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

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

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 dice:

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