PHP

Ξ 171 comentarios

Cómo hacer una autentificacion multiusuario con PHP y MySQL

por Xabadu
Cómo hacer una autentificacion multiusuario con PHP y MySQL

Lo prometido es deuda.

Tal como anunciamos en el pasado tutorial “Como hacer una autentificación de usuario en PHP”, hoy traemos esta segunda parte en la que haremos un sistema de autentificación más evolucionado, el cual además de ser multiusuario, incluye otras medidas de seguridad como manejo de sesiones, lo cual nos permitirá restringir el acceso a usuarios que obtengan la URL directa y de esta forma nadie podrá ingresar a nuestra página sin ingresar el nombre de usuario y contraseña correcto en el formulario.

Más información después del salto.

Cómo hacer una autentificación de usuario con PHP y MySQL

Como es habitual, vamos primero con lo que necesitamos para realizar esto:

Implementos necesarios:

  • Un editor Web. (Para este tutorial utilizamos Adobe Dreamweaver CS3, pueden descargar una versión de evaluación aquí).
  • Un servidor Web que soporte PHP, versiones 5 o inferiores (ya sea local, u algún hosting gratis, pueden encontrar algunos aquí)
  • Un sistema de bases de datos, puede ser cualquiera. (Para este tutorial utilizaremos MySQL por su facilidad de trabajo con PHP. Pueden tener una instalación local o buscar algún hosting que ofrezca).

El funcionamiento de este sistema es bastante simple y en algo parecido al anterior. Básicamente tendremos 3 archivos que definirán el ingreso de los usuarios:

1.- Un archivo HTML que contenga un formulario de ingreso, tal como el que hicimos en el tutorial anterior.

2.- Un archivo PHP que, recibidos los datos del formulario, se conectará a la base de datos y corroborará que los datos existan y que estos sean correctos.

3.- Y finalmente otro archivo PHP que redirigirá a los usuarios dependiendo del resultado de la consulta hecha en el nº 2. Si están bien los datos los llevará a la página que queramos mostrar, y de lo contrario, mostrará un mensaje de error y los llevará de vuelta a la página del nº 1.

Con todo listo, manos a la obra:

Procedimiento

1.- Lo primero es tener una página HTML que contenga un formulario, tal como lo hicimos en el tutorial anterior. Al igual que en el formulario anterior, el “Action” de nuestro formulario dirigirá a “ingreso.php“.

A continuación, definiremos una tabla en la base de datos la cual almacenará los datos correspondientes a todos los usuarios autorizados a entrar a nuestra página. Para definir esta tabla e ingresar algunos datos de prueba, lo más recomendable es usar un sistema que todos los servicios de hosting ofrecen y que también es obtenido haciendo una instalación local (mediante el uso de algún software como XAMPP), que es phpMyAdmin. Este programa nos permite trabajar directamente sobre la base de datos, dandonos entre otras funcionalidades, la posibilidad de mantener datos, agregar usuarios y ver la estructura actual de nuestra BD.

Interfaz de phpMyAdmin

Interfaz de creación de tablas

Modo de consultas SQL

Brevemente puedo decir que phpMyAdmin trabaja de 2 formas sobre la base de datos: Una mediante el interfaz gráfico el cual ofrece un modo bastante amigable para la creación y mantención de las estructuras y los datos. El otro es mediante consultas SQL, el cual si tienen el conocimiento del lenguaje es recomendable utilizar.

2.- Una vez adentro de PHPMyAdmin, crearemos una base de datos con el nombre que Uds. quieran y luego una tabla llamada “usuario” y dentro de ella definiremos los siguientes campos:

Usuario=> Varchar (10)

Clave => Varchar (10)

Nombre => Varchar (40)

Interfaz de configuración de campos

Además definiremos como “clave primaria” de la tabla al campo “usuario”

Marcando esto en el campo correspondiente lo definimos como “Clave Primaria”

¿Qué es una clave primaria?

Una clave primaria es un atributo que sirve como identificador de la tabla, el cual permite individualizar cada registro de los otros existentes. Una clave primaria debe ser única, no nula, completa y cumplir el principio de minimalidad (el menor número de campos posibles y que estos sean lo más simples que se puedan). Para este caso usar el campo “usuario” es lo apropiado ya que en cada sistema no puede, o mejor dicho no debe, haber más de un individuo con el mismo nombre de usuario.

3.- Con nuestra tabla definida, procederemos a ingresar datos a la tabla, al igual que el paso anterior, esto se puede hacer mediante interfaz o por una consulta SQL. Ingresaremos estos datos:

Usuario => demo

Clave => demo

Nombre => Usuario de prueba

Para ingresar los datos mediante interfaz, debemos marcar la tabla y hacer click al botón “Examinar” que esta justo al lado y luego arriba al que dice “Insertar”.

Botón Insertar

Con esto tenemos un usuario ingresado en nuestra base de datos y podremos hacer uso de ese registro para probar nuestro sistema.

4.- A continuación construiremos la página en PHP que validará los datos recogidos a través del formulario:

Para esto, crearemos una página PHP en Dreamweaver, la cual guardaremos como “ingreso.php” e insertaremos el siguiente código antes de la etiqueta <HTML>:

<?
session_start();

$_SESSION[“user”]=$_POST[‘usuario’];
$_SESSION[“pass”]=$_POST[‘clave’];
$_SESSION[“falla”]=0;

?>

<meta http-equiv=”refresh” content=”3; url=ingreso2.php” />

La explicación del código es la siguiente:

<?: Marca el inicio de un código ejecutable PHP.

session_start();: Se inicia una sesión para el usuario que está ingresando a nuestra página.

$_SESSION[“user”]=$_POST[‘usuario’];: Lo que hacemos aquí es tomar el valor “usuario” enviado desde el formulario (lo recogemos en el vector $_POST, el cual almacena todos los valores enviados por URL desde un formulario) y se lo asigna al valor “user” en el vector $_SESSION, el cual se encarga de almacenar variables que podrán ser accedidas desde cualquier página mientras la sesión exista o el usuario se mantenga en la página.

$_SESSION[“pass”]=$_POST[‘clave’];: Lo mismo que el caso anterior pero con los valores correspondientes.

$_SESSION[“falla”]=0;: Creamos una variable llamada “falla” dentro del vector de sesión, la cual usaremos como bandera que marcará cualquier error que se produzca durante el proceso de validación. Le asignamos un valor 0, pero en verdad podemos darle el valor que queramos, ya que la verificación final con esta variable la haremos mediante una comparación con su valor original.

?>: Cerramos el código ejecutable PHP

<meta http-equiv=”refresh” content=”3; url=ingreso2.php” />: Esta etiqueta lo que hará es redireccionar la página actual (“ingreso.php”) a la página “ingreso2.php” cuando transcurran 3 segundos. (El valor del parametro content, que pueden modificar según deseen).

Antes de seguir:

¿Qué es una sesión?

Cada vez que un usuario en particular visita una página de nuestra propiedad, nuestro servidor le asigna una sesión unica, la cual se encarga de individualizar a cada usuario sobre otro que pueda estar viendo nuestro sitio, ya sea al mismo momento o durante cualquier otro. La individualización se realiza mediante la asignación de “identificadores de sesión”, los cuales son generados al azar y basandose en diferentes parametros para cada caso, por lo que la probabilidad de que una identificación de sesión de 2 usuarios distintos se repita es altamente improbable si no imposible. Esto es bastante similar al funcionamiento de las “cookies”, a diferencia que es un método mucho más seguro, ya que en el caso de las cookies, si un navegador las tiene desactivadas se imposibilita el reconocimiento del usuario, mientras que el método de las sesiones corre para todos por igual.

PHP, así como otros lenguajes dinámicos para páginas (como JSP, ASP, etc), nos otorga la posibilidad de trabajar con un vector de sesión llamado $_SESSION, el cual se adjunta al identificador ya asignado por el servidor. En este vector nosotros podemos definir un número interminable de variables, a las cuales podremos acceder desde cualquier página de nuestro sitio, sin la necesidad de pasar las variables por URL (los casos de POST y GET que veíamos en el tutorial anterior). Para poder hacer uso del vector de sesión es necesario usar la sentencia session_start(); al inicio de cada página PHP que lo requiera.

Pueden obtener más información sobre sesiones en PHP, aquí.

5.- Continuando con el código que insertaremos en nuestra página “ingreso.php”, ahora pondremos esto luego de la etiqueta <BODY>:

(Las explicaciones del codigo van entremedio marcadas en negrita, cursiva y con un /* y */)

<?
$user=$_POST[‘usuario’];
$pass=$_POST[‘clave’];

/* Asignamos a las variables $user y $pass los valores “usuario” y “clave” recogidos de nuestro formulario de ingreso de la página HTML. */

if(empty($user))
{
echo “No ha ingresado un nombre de usuario. <br> Sera redirigido de vuelta.”;
$_SESSION[“falla”]=1;
}

/* Utilizaremos la función empty de PHP mediante la cual preguntaremos si nuestra variable $user (la que contiene el valor de usuario del formulario) se encuentra vacia, lo que significaría que el usuario no ingreso nada en el campo. Si este fuera el caso, desplegaríamos un mensaje en la página con “echo” y luego cambiariamos el valor de nuestra variable “falla” (la bandera definida en el vector de sesión) a 1. En caso de que el usuario no este vacío, pasamos al else y revisamos lo demás */


else
{
if(empty($pass))
{
echo “No ha ingresado una clave. <br> Sera redirigido de vuelta.”;
$_SESSION[“falla”]=1;
}

/* Haremos la misma comprobación anterior pero en este caso con la variable $pass (que almacena el valor de clave del formulario). En caso de que no este vacía, pasamos al else */
else
{
$con=mysql_connect(“host”,”user”,”password”);

/* Declaramos una variable llamada $con a la que le almacenaremos el resultado de la función mysql_connect, la cual se encarga de establecer una conexión entre nuestra página PHP y nuestra base de datos MySQL para poder realizar las consultas que necesitamos para validar los datos. Esta función utiliza 3 parametros y devuelve un resultado de tipo entero (int):

Host: La dirección del servidor donde tenemos alojada nuestra base de datos. Comúnmente este valor debiera ser localhost (en caso de que esta página la ejecutemos en el mismo servidor donde esta alojada la BD), si no, es un dato que su proveedor de hosting debería darles.

User: El usuario con el que ingresan a la BD. Tambien otorgado por su proveedor de hosting.

Password: Contraseña para ingresar a la BD. Lo mismo que el caso anterior. */

mysql_select_db(“database”,$con);

/* Llamamos a la función mysql_select_db la cual nos ayudará a seleccionar nuestra base de datos (la cual esta dentro de la base de datos) y que requiere de 2 parametros:

Database: Nombre de nuestra base de datos. (La que creamos al principio).

Identificador de conexión: El cual le otorga los datos de conexión a la función, en nuestro caso la variable $con. */


$sql=”SELECT usuario, clave, nombre FROM usuario WHERE usuario=’$user'”;

/* Definimos una variable $sql , la cual guardará la consulta que haremos en la base de datos. En este caso, pediremos seleccionar el usuario, la clave y el nombre correspondientes al registro del usuario que se ingresó mediante el formulario */


$resultado=mysql_query($sql,$con);

/* Definimos una variable llamada $resultado en la cual almacenaremos, valga la redundancia, el resultado de la ejecución de nuestra consulta mediante la función mysql_query, la cual requiere de 2 parametros: la consulta recien definida, y el identificador de conexión que definimos anteriormente. */


if(!$resultado)
{
$error=mysql_error();
print $error;
$_SESSION[“falla”]=1;
exit();
}

/* Luego preguntamos mediante un if si no hubo resultado a la ejecución de la consulta y almacenamos en la variable $error la falla otorgada por la base de datos para presentarla en la página mediante la sentencia print (que es similar a “echo”) y cambiamos el valor de la variable “falla” de nuestro vector de sesión. Finalmente hacemos uso de la función exit(); para que nuestro código termine de ejecutarse aquí y no sigan corriendo las líneas siguientes. Este paso puede obviarse ya que a los usuarios no es necesario enseñarles el error que nos da la base de datos, yo decidí incluirlo para que uds. puedan probar e informarse de las distintas razones por las que puede haber una falla en este proceso. */


if(mysql_affected_rows()==0)
{
echo “El usuario no fue encontrado. <br> Sera redirigido de vuelta.”;
$_SESSION[“falla”]=1;
exit();
}

/* Luego mediante otro if , hacemos un llamado a la función mysql_affected_rows() la cual se encarga de notificar si es que la consulta no afecto a ninguna fila de nuestra tabla (o sea, no hubo coincidencias), esta función retorna un entero, que es 0 en caso de no haber filas afectadas. En caso de que así sea desplegamos un mensaje informando que el usuario no fue encontrado mediante la sentencia “echo”, cambiamos el valor de la variable falla del vector de sesión y finalmente salimos del código mediante la función exit();. Si el resultado de la función no es cero, significa que hubo coincidencias y pasamos al else */


else
{
$row=mysql_fetch_array($resultado);

/* Definimos una variable $row y a esta le asignamos el resultado de la función mysql_fetch_array, la que utiliza como parametro $resultado (el resultado de la consulta ejecutada). Este paso es necesario, ya que cuando hacemos una consulta sobre una tabla de una base de datos, en caso de haber coincidencia, estos datos no están disponibles para que nosotros los podamos manipular, si no que se seleccionan de forma “virtual”. Normalmente las bases de datos definen cursores, los cuales al hacer un fetch, extraen los datos y nos permiten manipularlos de una forma más “fisica” por decirlo de alguna forma. En este caso, la variable $row se transformará en un vector, con posiciones de nombre igual a cada uno de los campos de la fila, los cuales podremos comparar. */


$nombre=$row[‘nombre’];

/* Definimos una variable $nombre y a este le asignamos el valor de la posición “nombre” del vector $row, o sea, el campo nombre extraído de la coincidencia de la tabla usuario */

if($user==$row[‘usuario’])
{
if($pass==$row[‘clave’])
{
echo “<b>Bienvenido $nombre</b>. <br> Espere mientras es redirigido”;
$_SESSION[“nombre”]=$nombre;

}
else
{
echo “Hay un error en la clave. <br> Espere mientras es redirigido”;
$_SESSION[“falla”]=1;
}
}
else
{
echo “Hay un error en el nombre de usuario. <br> Espere mientras es redirigido”;

$_SESSION[“falla”]=1;
}

/* Y Finalmente mediante una serie de if y else, comparamos los valores recibidos por el formulario (almacenados en las variables $user y $pass) con los extraídos de la fila de la tabla de la base de datos (almacenados en el vector $row). En caso de coincidir el nombre de usuario y la contraseña, desplegamos un mensaje dandole la bienvenida al usuario con una sentencia echo (al usar el mensaje con la variable $nombre, dejamos definido un mensaje que cambiará dependiendo del nombre de cada usuario que entre) y le informaremos que será redirigido, para finalmente registrar en el vector de sesión el nombre del usuario, en caso de que necesitemos usarlo más adelante. De lo contrario mostraremos los correspondientes mensajes de error y marcaremos la variable falla para más adelante. */
}
}
}

?>

Y con eso terminamos nuestra página de validación. A continuación haremos una página PHP llamada “ingreso2.php”, la cual se encargará de redirigir adecuadamente al usuario dependiendo del resultado de la validación de datos.

6.- Creamos nuestra página PHP e insertamos el siguiente código antes de la etiqueta <HTML>:

La explicación del código entremedio, en negritas, cursiva y entre /* */:

<?
session_start();

/* Iniciamos sesión dentro de esta página también mediante la función session_start(); */

if($_SESSION[“falla”]==0)
{

$_SESSION[“autorizacion”]=”si”;

header(“Location: pagina-de-destino.php”);

}

/* Lo primero que hacemos es preguntar si la variable “falla” del vector de sesión tiene valor igual a 0. Si esto es así significa que paso todo el proceso de validación sin errores, ya que en la página anterior ante cualquier problema le asignamos otro valor. En caso de que sea así, hacemos una redirección por PHP mediante “header” y dentro de Location ponemos la página de destino donde llegaran los usuarios autorizados. Además definimos una variable llamada “autorización” y le asignamos el valor “si”. Este variable nos permitirá hacer un manejo de sesiones en cualquiera de las páginas que sigan preguntando simplemente si esta activado el valor si, y de esa forma mostrar el contenido autorizado */

else
{
unset($_SESSION[“falla”]);

session_destroy();

header(“Location: pagina-de-formulario.html”);

}
?>

/* En caso de que no sea igual a cero el valor, significa que hubo un problema de validación y por lo tanto el usuario no esta autorizado. Por lo que borramos la variable falla del vector de sesión mediante la funcion “unset”, y luego destruimos la sesión del usuario mediante la función session_destroy();, para que así ningun valor de la sesión quede almacenado en caso de futuros ingresos. Finalmente redirigirmos mediante header a la página inicial de ingreso de formulario. */

Mediante ingreso2.php redirigiremos al usuario dependiendo del resultado de validación de datos, lo cual nos permitirá restringir el acceso a quienes no tengan los datos correctos que tengamos almacenados en nuestra base de datos. A continuación veremos brevemente como hacer un manejo de sesión para nuestras páginas que proseguirán este proceso.

La importancia de un manejo de sesión radica en que, a pesar de hacer una validación extensiva de datos, si no hay un manejo apropiado de las sesiones, cualquier usuario que obtenga la URL final de una forma u otra (la correspondiente a las páginas que vendrán despues del ingreso de datos), podrán ver el contenido, independiente del nombre de usuario y contraseña que hayan ingresado. Este es un proceso bastante simple de hacer, ya que solo requiere de una sentencia if.

7.- En nuestra página de destino (la que viene después del proceso de validación) solo necesitamos insertar el siguiente código después de la etiqueta <BODY>:

<?

if($_SESSION[“autorizacion”]==”si”)

{

?>

y aquí desplegamos el contenido para los usuarios autorizados. Una vez que terminemos de desplegar el contenido, al final de eso abrimos código nuevamente:

<?

}

else

{

echo “Usted no esta autorizado para ver este contenido. Por favor” ?> <a href=”pagina-de-formulario.html”><? echo “Identifiquese” ?></a>.

}

?>

Nota: En el caso del else, es necesario cerrar el codigo PHP antes de ingresar código HTML (como el <a href ), por eso cerramos y volvimos a abrir para seguir con el texto.

Este manejo de sesiones es bastante básico, pero aún así efectivo. Les recomiendo informarse más sobre el manejo de sesiones para establecer un grado máximo de seguridad en sus páginas y que nadie pueda burlar su sistema de autentificación y ver contenido al que no estan autorizados a ingresar.

Y con eso último terminaríamos nuestro sistema de autentificación multiusuario en PHP y MySQL. Tal como les digo, les recomiendo de a poco ir interiorizandose más con el tema de las sesiones y distintas opciones de seguridad que nos ofrece tanto PHP como otros lenguajes dinámicos, lo cual los ayudará a construir páginas cada vez más seguras.

Así que con eso estaríamos dando fin a este largo tutorial, el cual esperamos sea de su utilidad. Como siempre les recordamos dejar sus comentarios y especialmente dudas o problemas que puedan tener sobre el desarrollo de esto, las cuales serán respondidas a la brevedad. Hay algunos pasos bastante complejos, así que en caso de que algo les ocasione problemas, no duden en preguntarnos.

Espero que lo escrito aquí haya sido de su utilidad, y me despido, recordandoles que este tutorial ha sido desarrollado, documentado y probado personalmente por el equipo de Comolohago.cl, por lo que le adjuntamos nuestro sello de garantía.

Muchas gracias por leer y será hasta una próxima oportunidad.

Staff CLH

Comparte este tutorial

El culpable de todo esto

Las tardes gloriosas de domingo y las grandes ovaciones a estadio lleno, no son algo extraño para Xabadu. Luego de ser descubierto a los 4 años en un partido de barrio por los ojeadores del gran Aviación F.C., sacudió el mercado nacional al ser traspasado en $500 pesos chilenos (1 USD) y 3 coca colas al renombrado Estrella Blanca de Lolol. Luego de una impresionante carrera por equipos como Lozapenco, Santa Cruz, Deportivo Lago Chungará y una incursión en la 3a división del futbol de Kazajstan, su record imbatible hasta la fecha de 1257 goles en 20 partidos lo llevo a ser elegido como uno de los arqueros más recordados en la historia pelotera nacional. Una lesión en el colmillo superior derecho lo llevó al retiro el año 2003, pero está de vuelta y sin duda que su jerarquía y experiencia internacional será un gran aporte.

En los barrios marginales se le conoce como: Xabadu

Comentarios en Facebook

171 Comentarios

  • Hola amigos! Necesito una ayuda…

    Antes que nada Muchas Gracias!!! muy didactico y entendible…

    Ahora se me presenta un problema al momento de entrar en la pagina despues de la validacion…

    La consulta se hace perfectamente… debido a que ingreso2.php me devuelve el nombre del Usuario. Cuando me redirecciona me sale el mensaje de que NO ESTOY AUTORIZADO

    Se me cierra la session???

    Copie el codigo tal cual esta aca…

  • Mira estoy muy interesado en el tema pero como saben la gran mayoria somos aprendices y buscamos conocimiento sino no estariomos usmeando por internet pero esta bueno el aporte pero como consejo en lo particular me gustaria ver un ej. archivo.zip o algo para verlo corriendo y estoduar a partir de algo correcto no estar adivinando ya que el postear esperar respuesta y demas es tedioso y si el fin es enseñar hagamoslo bien nada cuesta..

    saludos buenisima pagina.

  • hola.. no tengo mucho conocimiento programando solo lo esencial… sera me puedes ayudar con el codigo, para insertar datos en una tabla que este relaciona. yo inserto datos en tablas que no estan relacionas y quisiera saber que tengo que hacer para hacerlo en tablas relacionadas

  • Hola buen día, este código igual se puede usar en ODBC como seria.

    GRACIAS

  • Holas necesitoa yuda con unsistemas los interesado enviarme un correo al
    jorgue_tkm@hotmail.com les pagarre lo sjusto por el sistema y de acuerdo al nivel gracias 28 de marzo del 2012 espero sus msn gracias

  • Muy buen post, todo me funciona, la conexión a la BD y todo, el único problema es que cuando ingreso un usuario y password abre la página que debe pero por algún motivo me muestra “Usted no esta autorizado para ver este contenido. Por favor Identifiquese” inclusive despues de haber pasado por todos los filtros, revisando me di cuenta que $_SESSION[“autorizacion”] en la pagina destino nunca tiene ningún valor. Agradeceria mucho la ayuda.
    Gracias

  • Ya arregle el problema y es que no había puesto al inicio de la página destino

    lo cual por cierto no mencionan en el tutorial

  • Ya arregle el problema y es que no había puesto al inicio de la página destino session_start() lo cual por cierto no mencionan en el tutorial

  • Para mi opinión muy bueno, no se si este tipo de autenticacion es seguro para las “Blind SQL Injection” (o lago así), ¿podeis indicarme si es seguro?.
    Y otra cosa, todo va bien excepto cuando ya se autentica y me redirige al archivo para ver el contenido autorizado me sale este error

    Notice: Undefined variable: _SESSION in f:\web estudio y pruebas\autenticacion\index.php on line 11
    Usted no esta autorizado para ver este contenido. Por favorIdentifiquese.

    ¿como paso esa variable se sesion al nuevo archivo?

    Muchas gracias.

    Atte.

    Roberto

  • Solucionado, lei el post anterior, y vi que yo tampoco inicie sesion en la pagina destino.

    Gracias.

    Todo va bien (de momento).

    Roberto

1 14 15 16 17 18

Deja un comentario

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

Gente linda que nos quiere

Donde mas estamos