Control de sesiones – Autenticación de usuarios usando PHP y MySQL

Quiero compartir una forma práctica y sencilla para poder crear un inicio de sesión, controlar las sesiones o, quizás más práctico decir, Crear una autenticación de usuarios, utilizando la tecnología LAMP (Linux, Apache, MySQL y PHP) en un sitio web dinámico mediante PHP. Para la instalación de LAMP en Ubuntu, remitirse a éste post…

Bien, como sabrán los archivos php que veremos a continuación se deberán de copiar en la carpeta donde Apache permite las publicaciones de las páginas web. Para el caso de haber hecho la instalación en Ubuntu, generalmente la dirección es: /var/www

Si utiliza tecnología como XAMPP en Windows, los archivos se deberían de copiar en c:\xampp\htdocs.

Lo primero es, crear nuestro archivo index.php, el cual será el primer archivo que se invoque para nuestro inicio de sesión. Prácticamente es puro HTML por lo que no se explicará mucho al respecto. Se dejó lo más sencillo posible para efectos didácticos.

<html> 
<head> 
<title>Inicio de sesión</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
</head> 
<body> 
<form action="control.php" method="post" id="form">
<br> Usuario: <input type="text" name="usuario" id="usuario" />
<br> Clave: <input type="password" name="clave" id="clave" />
<br> <input type="submit" value="Entrar"> </form> 
</body> 
</html>

Como se ve en el archivo index.php, el <form> direcciona al archivo control.php el cuál sería el archivo encargado de realizar la validación del usuario y contraseña ingresado. A continuación, se muestra el archivo control.php

<? 
/* A continuación, realizamos la conexión con nuestra base de datos en MySQL */ 
$link = mysql_connect("localhost","root","123456"); 
mysql_select_db("base_datos", $link); 

/* El query valida si el usuario ingresado existe en la base de datos. Se utiliza la función htmlentities para evitar inyecciones SQL. */ 
$myusuario = mysql_query("select idusuario from usuarios where idusuario = '".htmlentities($_POST["usuario"])."'",$link); 
$nmyusuario = mysql_num_rows($myusuario); 

//Si existe el usuario, validamos también la contraseña ingresada y el estado del usuario... 
if($nmyusuario != 0)
{ 
  $sql = "select idusuario from usuarios where estado = 1 and idusuario = '".htmlentities($_POST["usuario"])."' and clave = '".md5(htmlentities($_POST["clave"]))."'"; 
  $myclave = mysql_query($sql,$link); 
  $nmyclave = mysql_num_rows($myclave); 
  //Si el usuario y clave ingresado son correctos (y el usuario está activo en la BD), creamos la sesión del mismo. 
  if($nmyclave != 0)
  { 
      session_start(); 
      //Guardamos dos variables de sesión que nos auxiliará para saber si se está o no "logueado" un usuario 
      $_SESSION["autentica"] = "SIP"; 
      $_SESSION["usuarioactual"] = mysql_result($myclave,0,0); 
      //nombre del usuario logueado. 
      //Direccionamos a nuestra página principal del sistema. 
      header ("Location: app.php"); 
   }
   else{ 
      echo"<script>alert('La contrase\u00f1a del usuario no es correcta.'); window.location.href=\"index.php\"</script>"; 
   } 
}
else
{ 
    echo"<script>alert('El usuario no existe.'); window.location.href=\"index.php\"</script>"; 
} 
mysql_close($link); ?>

Como podemos apreciar del código (muy sencillo por cierto) hacemos una validación de la información ingresada por el usuario (usuario y contraseña) contra la información que están en la base de datos, para así finalmente, si todo esta bien, se direcciona a la aplicación principal; sino, muestra un mensaje de alerta indicando el problema. Ahora, no hemos hablado de la base de datos, por lo que a continuación realizaremos la creación de la misma y crearemos la tabla de usuarios (sencilla). Lo primero, es entrar a PHPMyAdmin así: http://localhost/phpmyadmin Nos autenticamos con nuestro usuario y contraseña y, una vez adentro, se da clic en “Base de Datos” para luego agregar el nombre de nuestra base de datos y damos clic en Crear. autentica01 En la parte izquierda ahora nos aparecerá la base de datos que creamos, por lo que damos clic en ella y en la parte derecha nos preguntará si queremos crear una tabla. Colocamos el nombre de la tabla, colocamos el # de columnas (para el ejemplo, con 3 campos nos basta: Usuario, Clave y Estado) y damos clic en “Continuar” autentica02 Ahora, colocamos el nombre de nuestros campos, el tipo de datos, la longitud y, en el caso del campo idusuario, le diremos que será llave primaria. Ver la siguiente imagen para mayor referencia. autentica03 Ahora, bajamos mediante la barra vertical de la ventanita y damos clic en “Guardar” para crear nuestra tabla. autentica05 Ahora, damos clic al botón “Insertar” para poder insertar un registro de prueba, y colocamos los nuevos valores (ver la imagen para mayor referencia) y finalmente damos clic en “Continuar”. autentica06 Continuando con la programación en PHP… Ahora, crearemos el archivo app.phpqué, según se vió en el archivo anterior, es donde se direcciona cuando el usuario ha ingresado correctamente el usuario y contraseña.

<? include("seguridad.php"); ?> 
<html> 
<head> 
<title>App</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> <h1>Bienvenido al sistema!</h1> 
<h2>Usuario: <? echo $_SESSION["usuarioactual"] ?> </h2><br> 
<p>Entro correctamente al sistema.</p><br><br> 
<a href="salir.php">Salir</a> 
</body> 
</html>

Pongamos atención a la primera línea… Estamos incluyendo a la página un archivo php específico el cuál éste validará si existe una sesión válida para poder mostrar la página. Si el archivo seguridad.php determina que existe una sesión válida, se termina de mostrar la página. Véase también la línea en donde está el código: echo $_SESSION[“usuarioactual”] ; Con ésto estamos mostrando el nombre del usuario que se autenticó. Dejamos un vínculo al archivo salir.php el cual es el encargado de terminar la sesión activa del usuario. Veamos el contenido del archivo seguridad.php

<? 
//Reanudamos la sesión 
@session_start(); 
//Validamos si existe realmente una sesión activa o no 
if($_SESSION["autentica"] != "SIP")
{ 
  //Si no hay sesión activa, lo direccionamos al index.php (inicio de sesión) 
  header("Location: index.php"); 
  exit(); 
} 
?>

Aqui vemos la parte de seguridad de éste sistema… Si alguien mal intencionado quisiera entrar, sin pasar por el inicio de sesión, a app.php, como existe una validación mediante el archivo seguridad.php, automáticamente se le redireccionará al inicio de sesión. Mientras no haya un inicio de sesión correcto, no se puede mostrar el archivo app.php, por lo que todas las páginas que creamos del sistema deberán de tener el include(“seguridad.php”) para que así valide si realmente el usuario está autenticado. Finalmente, veamos el archivo salir.php

<? 
//Reanudamos la sesión 
session_start(); 
//Literalmente la destruimos 
session_destroy(); 
//Redireccionamos a index.php (al inicio de sesión) 
header("Location: index.php"); 
?>

Y así cerramos la sesión. Si bien es cierto no es la mejor forma de autenticación que existe en el mundo PHP, es la más sencilla a mi criterio y pues se sigue implementando.

A continuación, las capturas de pantalla de ésta mini aplicación web:

autentica07

autentica08

 

Puede descargar los archivos de ejemplo AQUIII.

Comentarios por Facebook

comentarios

8 respuestas a “Control de sesiones – Autenticación de usuarios usando PHP y MySQL”

  1. Pues nada….. me descargo tus archivos,porque tocando codigo no logro que funcione. pongo el acceso a la base de datos correcto, cambio en el control.php de <? a <"?php"

    Pongo el usuario y la contraseña incorrectos y no entra. Pero escribo para acceder a app.php y accede sin problemas….. estando el include seguridad y todo teoricamente correcto.

    Vamos que no funca….

  2. 🙁 No me lee la contraseña no paso del index si esta leyendo la base de datos por que si le pongo un usuario que no existe me dice que el usuario no existe pero ingreso usuario y contraseña correcto y siempre me manda el mensaje “La contraseña no es correcta”. Me pueden ayudar???
    Muchas Gracias

  3. Saludos buen post. necesito ayuda para iniciar session pero quisiera comprobar los usuarios de dos tablas distintas. la tabla Admins y la tabla Clientes. e visto con con If sencillo. pero quisiera hacerlo con Statement de msqli para hacerlo un poco mas seguro.

  4. hola buen dia el codigo de validación no me funciona me dice clave incorrecta hice lo que sugiere daniel de cambiar el 1 por 0 en la linea if($nmyclave != 1) pero al momento de colocar la cle me toma cualquiera como valida, saludos, espero me ayuden

  5. Para que tu código te funcione, debes tener en cuenta que tienes que crear una base de datos, y esa base de datos debe tener un nombre, en la cual en el link = mysql_connect(“localhost”,”ocho”,”1234″); debes colocar el nombre de tu base de datos, y tu contraseña.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*