> Manuales > Sistema de autenticación con PHP

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.

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.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual