Autentificación PHP para múltiples usuarios usando MySQL

Valoración del artículo:
Página PHP que necesitaríamos para realizar un acceso restringido por clave y contraseña para múltiples usuarios, donde cada uno tenga unos datos de acceso propios, que se guardan en la base de datos.
Publicado: 10/2/03
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Vamos a ver las páginas PHP que necesitaríamos para realizar un acceso restringido por clave y contraseña para múltiples usuarios, donde cada uno tenga unos datos de acceso propios.

Nota: Este artículo viene a complementar el manual Sistema Autentificación en PHP. De hecho, en este artículo sólo vamos a tratar la página que recoge los datos del usuario (su nombre y contraseña) y comprueba si son correctos, redireccionando a la aplicación segura (si los datos se corresponden con algún usuario de la base de datos), o a la página de entrada (si los datos no correspondían con ningún usuario registrado).


Lo primero es recordar el esquema de páginas del sistema de autentificación propuesto. Lo podemos ver en el artículo Funcionamiento del sistema de autentificación en PHP. Nosotros vamos a tratar de colocar aquí un código para la página "compruebo datos"

La base de datos

La base de datos que vamos a utilizar contendrá una tabla para los usuarios, donde cada uno dispondrá, al menos, de dos campos: un nombre de usuario y una contraseña, los dos de tipo texto.

Tabla usuario
Nombre del campo Tipo del campo
nombre_usuario Texto
clave_usuario Texto

En una base de datos de usuarios, el nombre de usuario debería ser un valor único, irrepetible para otro usuario, es decir, no podremos tener dos usuarios con el mismo nombre. Por esta razón, el campo nombre_usuario podría ser la clave principal de la tabla, aunque también podríamos haber creado un campo adicional, llamado por ejemplo id_usuario, de tipo autonimérico y colocarlo como clave principal.

Para conseguir no insertar dos usuarios con el mismo nombre de usuario, a la hora de insertarlos en la tabla, comprobaremos que no haya ningún usuario ya introducido con el nombre de usuario que se pretende insertar. Este paso, aunque importante, no lo vamos a ver, pues sólo nos vamos a centrar en decidir si un usuario puede entrar o no en la aplicación, suponiendo que los usuarios se encuentran ya insertados en la base de datos.

En el ejemplo suponemos que utilizamos una base de datos MySQL, sin embargo, cualquier tipo de base de datos podrá servir para unos objetivos como los que nos proponemos.

El funcionamiento del script

El script que se utilizará para decidir si un usuario puede o no entrar en la aplicación es muy sencillo. Simplemente hace una llamada a la base de datos para comprobar si los datos de autentificación escritos por el visitante (usuario y contraseña) corresponden con los de algún usuario. En caso de que así sea, se permite la entrada y de no ser así, se deniega.

Nota: Este script fue comentado en una versión simplificada en el artículo Control de los datos de autentificación en PHP, englobado dentro del manual Sistema de autentificación PHP

Lo primero sería abrir una conexión con la base de datos y seleccionar la base con la que hemos de trabajar.

//conecto con la base de datos
$conn = mysql_connect("servidor","usuario","password");
//selecciono la BBDD
mysql_select_db("nombre_bbdd",$conn);


Un segundo paso es construir una sentencia SQL que nos permita comprobar si existe o no un usuario con los datos de autentificación introducidos. Utilizamos una simple sentencia SELECT, sobre la tabla de usuarios, donde se extraen usuarios que tengan el mismo nombre de usuario y la contraseña introducidos en la página de acceso.

//Sentencia SQL para buscar un usuario con esos datos
$ssql = "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and clave_usuario='$contrasena'";

//Ejecuto la sentencia
$rs = mysql_query($ssql,$conn);


Si esa sentencia SELECT responde con algún registro encontrado, sabremos que existe un usuario donde sus datos de autentificación corresponden perfectamente con los introducidos. En ese caso podremos realizar las acciones encaminadas a permitir el acceso. Por el contrario, si la sentencia SELECT no encuentra ningún registro, sabremos que no existe un usuario con los datos de autentificación introducidos y por lo tanto, deberemos realizar las acciones encaminadas a restringir el acceso.

if (mysql_num_rows($rs)!=0){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    session_register("autentificado");
    $autentificado = "SI";
    header ("Location: aplicacion.php");
}else {
    //si no existe le mando otra vez a la portada
    header("Location: index.php?errorusuario=si");
}


Las acciones para restringir o permitir el acceso son exatamente iguales a las que veníamos utilizando en el script de control sin utilizar la base de datos. Así que no vamos a comentarlas más, sino que os referimos al artículo donde las explicamos.

El código completo del ejemplo sería el siguiente.

<?
//conecto con la base de datos
$conn = mysql_connect("servidor","usuario","password");
//selecciono la BBDD
mysql_select_db("nombre_bbdd",$conn);

//Sentencia SQL para buscar un usuario con esos datos
$ssql = "SELECT * FROM usuario WHERE nombre_usuario='$usuario' and clave_usuario='$contrasena'";

//Ejecuto la sentencia
$rs = mysql_query($ssql,$conn);

//vemos si el usuario y contraseña es váildo
//si la ejecución de la sentencia SQL nos da algún resultado
//es que si que existe esa conbinación usuario/contraseña
if (mysql_num_rows($rs)!=0){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    session_register("autentificado");
    $autentificado = "SI";
    header ("Location: aplicacion.php");
}else {
    //si no existe le mando otra vez a la portada
    header("Location: index.php?errorusuario=si");
}
mysql_free_result($rs);
mysql_close($conn);
?>


Nota: Es importante destacar que esta página no debería contener ningún tipo de texto antes de la apertura de código PHP, ni tan siquiera saltos de línea. Esto es debido a que al final se realiza una redirección y este tipo de instrucciones solamente se puede ejecutar si no se ha escrito todavía ningún carácter en el cuerpo. Para ser más específicos, este es el error que obtenemos si escribimos antes en la página de enviar las cabeceras:

Warning: Cannot add header information - headers already sent by (output started at /htdocs/ejemplos/autentif-php_bbdd/control.php:2) in /htdocs/ejemplos/autentif-php_bbdd/control.php on line 26


Otra posibilidad de codificación

Previamente a la publicación de este artículo, Hector Varón, un lector de DesarrolloWeb.com, nos mandó un código de control que es básicamente el mismo que hemos explicado nosotros aunque con algunas diferencias que lo hacen interesante para su publicación.

Lo incluimos para que los interesados lo puedan descargar, y desde aquí mandamos nuestros agradecimientos a Hector.

Descargar otra posibilidad de código.

Comentarios
Fueron enviados 47 comentarios al artículo
38 comentarios no revisados
9 comentarios revisados:
Por: joca
15/5/03
hola. Mas que un comentario es una pregunta. Vuestro articulo me ha servido de mucha ayuda pero tengo una duda sobre algo que quiero hacer. En lugar de que abra siempre la misma pagina ¿se podría hacer que dependiendo de la primera letra del nombre del usuario abra una pagina determinada.?

RESPUESTA

Pues claro que puedes!! sólo necesitas programar el script... Lo que no creo que hagamos es programartelo nosotros. Si acaso te diré que deberías obtener la primera letra del nombre de usuario con las funciones de string de PHP y luebo disponer de alguna estructura de datos de tipo Array o similar que relacione esa letra con una URL donde redirigir al usuario.

Otra idea, que sí me parece más interesante como para publicar algún día un artículo, es guardar en la tabla de usuarios (en la base de datos MySQL) un campo con la URL donde dirigir al visitante cuando se autentifica. Entonces, al comprobar que el usuario es correcto recogeríamos ese dato de la tabla y redirigiríamos al usuario a dicho lugar.

Por: Nosferatu
01/10/03
Creo que la solucion al caso es bastante sencilla.

1) Deberías crear una fila mas en la base de datos, donde almacenarías la pagina de redirección de cada usuario.

2) Una vez autentificado el usuario y con la variable de sesión establecida, lo redireccionas a una pagina intermedia que lo única función que tendría seria re-ubicar al usuario.
En esa pagina podrías consultar por medio de la variable de sesión a la base de datos para obtener la dirección para enviar al visitante.
Funcion header junto con el resultado de la consulta a mysql.

Actualmente estoy utilizando un script de este tipo en mi empresa, pero por cuestiones de privacidad no puedo publicar el código, pero déjame decirte que no es para nada difícil, quizás necesites sentarte a leer un poco mas sobre el tema... es la única forma de mejorar.

*** Desde ya agradezco a los redactores del articulo, ya que me fue de mucha utilidad en mis principios. Muy buen trabajo muchachos, sigan así.
Por: Eduardo
16/1/04
Me parece muy acertado este tipo de codificación que han colocado en su web, para que los principiantes de PHP puedan adecuarse y practicar bastante este programa....los felicitito
Por: kraledin
26/1/04
Hola a todos
realice el script que ustedes dieron aqui, todo esta bien solo que cuando lo cargo por primera vez me dice que tengo lo siguiente:

Notice: Undefined index paso(es la variable qu edeclaro) in C:\...\seguridad.php on line 2

Warning: Cannot modify header information - headers alredy sent by (output started at .. c:\...\seguridad.php:2) in c:\inetpub\..\seuridad.php on line 4.

pero si vuelvo a cargar la pagina de nuevo si carga la pagina correctamente dandole paso al usuario...

de atemano gracias..
Por: Jose Corbacho
02/2/04
Creo que el manuel es muy bueno... pero cuando empiezas a profundizar faltan algunas cosillas:

Sería interesante poner algo de información para evitar la inyección de código SQL (addslashes() , mysql_espace_string() o otros medios) en las entradas del usuario. Y por otra parte sería conveniente almacenar las contraseñas en la BD en formato MD5 ( md5() ) para evitar que si alguien tiene acceso a la base de datos no conozca las contraseñas de los usuarios.

Un saludo
Por: Bernardo
28/4/04
Hola amigos, en primer lugar felicidades a todos los creadores de la web y a aquellos que con sus comentarios ayudan a que sigamos mejorando día a día. Bien, la solución que propongo para redireccionar a un usuario que hace login en nuestra página a una zona en concreto de nuestro sitio es la siguiente: en primer lugar crearemos un campo en nuestra tabla de la base de datos, donde almacenaremos información acerca del archivo al que se quiere redireccionar (p.e. podria almacenarse: aplicacion.php para un usuario, lo_que_sea.php para otro usuario ...). Nos vamos a control.php y ponemos lo siguiente:

if (mysql_num_rows($rs)!=0){
//usuario y contraseña válidos
//defino una sesion y guardo datos
session_start();
session_register("autentificado");
//autentificado sería una variable de sesión
//en la instrucción que sigue lo que se está haciendo es cargar el identificador de sesión
//en la variable de sesión, para comprobar a posteriori en seguridad.php si puedo o no
//autorizar el paso al individuo que lo solicita
$autentificado=session_id();
//con la función: mysql_fetch_row lo que se pretende es cargar los valores de los campos de
//una determinada fila, a los cuales se puede acceder luego como si de una matriz se tratara
$row = mysql_fetch_row($rs);
//el campo que he insertado en la tabla es el último de un total de 11, de ahí que acceda
//a la posición 10, ya que empezamos a contar de 0
header ("Location: $row[10]");
}else{
//si no existe le mando otra vez a la portada
header("Location: index.php?errorusuario=si");
}
mysql_free_result($rs);
mysql_close($conn);
?>


Os he puesto la parte de código que nos interesa de control.php

Un saludo a todos.
Por: AraDaen
26/9/04
estaba probando los ejemplos del artículo, y, una vez cerrada la sesion, a pesar de ello, si retrocedo en el navegador, todavia puedo acceder a la pagina de la aplicacion. :(

RESPUESTA

Yo creo que lo que estás viendo son páginas en la caché del navegador. Si recargas la página, con F5 o CTRL+F5, deberían saltar las alertas de seguridad e informarte que tienes cerrada la sesión.

Por: omar
25/2/05
una pregunta y si solamente tengo acceso a los nombres de los usuarios, y la contraseña se encuntra en otra lado(restringido)?; las sesiones pertenecen a un dominio, la idea era capturar la sesion y contraseña cuando se loguea en window, se puede?, gracias

wero_br...
opinion
13/5/09
muy bueno el manual

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo