Este es un ejemplo simple de autenticación de usuarios usando sesiones en PHP y consultando a una base de datos en MySQL. Voy a evitar pegar demasiado código en el post y me limitare a colocar enlaces hacia otra ubicación donde sea mas inteligible el mismo. (Solo pondré las partes esenciales en el post, el resto de código está en los enlaces)
En primer lugar, algunos datos necesarios:
- Servidor: localhost
- Usuario: usuario_mysql
- Password: clave_mysql
- Nombre de la base de datos: ejemplos
Luego el esquema simple de la tabla usuarios, que almacenara el nombre del usuario y la clave.
La manera mas práctica de organizar funciones en PHP es ubicarlas en un solo archivo, en este caso lo denominare funciones.php y este es su contenido. Este archivo posee funciones que permiten conectarse a la base de datos, consultar la existencia de un registro en la misma y verificar si la sesión fue iniciada con el nombre de usuario, cada vez que se desee utilizar solo bastaría poner include(‘funciones.php’) para incluirlo en cualquier script PHP.
Una vez que tenemos las funciones creadas, ya podemos empezar con el formulario de entrada (index.php), lo importante es que contenga algo tan simple como esto:
<form method=’POST’ action=’index2.php’>
Usuario <input type=’text’ name=’usuario’/><br/>
Password <input type=’password’ name=’clave’><br/>
<input type=’submit’ value=’Ingresar’/><br/>
</form>
Este formulario enviara dos valores (usuario y clave) hacia el archivo index2.php, este archivo recogerá los datos enviados y los usará en la función conexiones(), si el usuario existe se iniciará la sesión e ingresará a las páginas permitidas para el usuario (ingreso.php, sistema.php), si no existe volverá al formulario de ingreso.
<?php
include (‘funciones.php’);
//usuario y clave pasados por el formulario
$usuario = $_POST[‘usuario’];
$clave = $_POST[‘clave’];
//usa la funcion conexiones() que se ubica dentro de funciones.php
if (conexiones($usuario, $clave)){
header(‘Location:ingreso.php’);
} else {
header(‘Location: index.php’);
}
?>
Ingreso.php y todas las páginas que se desean mantener disponibles solo a usuarios registrados deberán tener la forma de:
<?php
include (‘funciones.php’);if (verificar_usuario()){
//aqui debe venir todo el contenido necesario que solo el usuario validado puede acceder
print «Desconectarse <a href=’salir.php’/>aqui</a>»;
} else {
header(‘Location:index.php’);
}
?>
Donde se usa la función verificar_usuario(), para permitir el acceso si es que el nombre del usuario fue configurado en una sesión, si la función devuelve un valor falso, retornara al formulario de entrada. Es necesario que todas las paginas posean parte de este código, así se evitará que un intruso pueda poner la url de una pagina interna y esta sea visible o accesible sin haber verificado al usuario.
Para salir del sistema y borrar la sesión se usa el archivo salir.php, este archivo contiene instrucciones para destruir la sesión y volver al formulario de ingreso, también esta validado solamente para usuarios verificados:
<?php
include (‘funciones.php’);
if (verificar_usuario()){
session_unset();
session_destroy();
header (‘Location:index.php’);
} else {
header (‘Location:index.php’);
}
?>
Lo que no se debe olvidar al agregar mas paginas al sitio es incluir el archivo de funciones.php y usar la función verificar_usuario() para poder elegir entre el contenido al que debe acceder el usuario validado y el contenido para el visitante (usuario no validado).
Este ha sido un ejemplo simple de uso de sesiones en PHP, consultando a una base de datos en MySQL, existen muchas formas de lograr esto y obviamente mejorarlo, este es solo un ejercicio, útil para comprender el uso de sesiones.
Happy PHP Coding 🙂
Para los que van a copiar este ejemplo ciegamente, $_POST y ningún otro dato enviado por usuarios debe usarse directamente en nuestro código sin sanearlo antes.
El ejemplo de Sergio es tan solo para *ilustrar* cómo funcionan las sesiones, no lo clonen.
Me gustaMe gusta
eso 😀 lo que dice Diego es muy cierto, el uso de $_POST y cualquier función que permita al usuario ingresar valores, deben complementarse con otras funciones que eviten que se puedan ingresar valores no permitidos y así sufrir ataques.
Aquí algunos detalles adicionales:
http://www.onlamp.com/pub/a/php/2003/03/20/php_security.html
happy coding
Me gustaMe gusta
si podria colgar el codigo de cargar imagenes en php y mysql .. gracias
Me gustaMe gusta
Mil gracias esta bien explicado
Me gustaMe gusta
Profesor Sergio, una pregunta si es un sitio web en la que todos entraran para ver mi sistema de incidencias, entonces ya no manejo autentecacion de usuarios ?, o estaba pensando que la página tenga permisos osea el usuario que es administrador tenga permisos despues de logarse para administrar el sitio, y los que no, solo vean listas de las incidencias que ocurren.
uyyy creo que me enrede jeje, bueno tengo esa duda 🙂
Me gustaMe gusta
Permisos para el administrador y moderadores, el resto debe ver la lista de incidencias pero no editarla.
Me gustaMe gusta
Muy bueno el ejercicio, claro como el agua.
Se agradece!
José.
Me gustaMe gusta
esta bueno el tutorial
Me gustaMe gusta
Muchas gracias. El mejor tutorial sobre autentificación que he encontrado. Enhorabuena por el trabajo
Me gustaMe gusta
seria interesante agregarle a este ejemplo la parte de encriptacion y administracion de cuentas :p
Me gustaMe gusta
Hola, me funciona todo correcto mi pregunta es como seria para al entrar el usuario tenga la opcion de ver su perfil (sus datos) individualmente
Me gustaMe gusta
Para ello habria que lanzar una consulta adicional a la BD considerando los privilegios adicionales
Me gustaMe gusta
Buen tutorial,gracias por el aporte y sigue asi.
Me gustaMe gusta
<?php
include (‘funciones.php’);
if (verificar_usuario()){
//aqui debe venir todo el contenido necesario que solo el usuario validado puede acceder
print “Desconectarse aqui”;
} else {
header(‘Location:index.php’);
}
?>
cuando yo pongo esto en cada pagina por seguridad para que nadie entre me da este :Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at C:AppServwwwproenviostep1.php:10) in
como me pueden ayudar?
Me gustaMe gusta
Eso es porque la sesión ya fue iniciada en el archivo step1.php, debes revisar eso, para evitar conflictos de inicio de sesión
Me gustaMe gusta
Excelente el tutorial!
Me gustaMe gusta
gracias por la ayuda ya pude resolver el problema
Me gustaMe gusta
Profe una preguntita si es posible, como seria el post que para cuando se registre un nuevo usuario tenga que validar la cuenta por email. Muchas Gracias Horacio
Me gustaMe gusta
me podrias ayudar a saber como mantengo mi sesion abierta en todas mis paginas?
Me gustaMe gusta
Hola buen día, esta muy bien el tutorial pero como seria para ODBC tengo tiempo buscándolo pero no he podido encontrar nada, les agradecería mucho, soy novato en esto
GRACIAS
Me gustaMe gusta
Hay alguna manera de modificar este codigo para hacer un nivel de acceso a diversas paginas por ejemplo el administrador tener privilegios de entrar a todas las paginas y los demas usuario solo puedan entrar un numero limitado de paginas, me imagino que se puede, podrian ayudarme con el codigo.
gracias 🙂
Me gustaMe gusta
profe disculpe tengo una consulta como podria hacer para que cuando ingrese ya sea el usuario o contraseña incorrecta x 3 veces ps me salga un anuncio o solo se cierre la pagina como podria hacer eso?
Me gustaMe gusta
Holla Holla …. yo tengo una pregunta, como puedo evitar que el usuario al salir de la secion se le de por ir «atras» a la pagina de acceso en el navegador y que este vuelva y cargue la informacion de loguea al darle «reenviar» ??
No se si me hice entender bien.
Me gustaMe gusta
Excelente ejemplo, sencillo y práctico, gracias.
Me gustaMe gusta
Yo tengo una duda, como o donde se le agregaria el codigo para que despues de un tiempo determinado digase 5min expire la sesion.
Gracias, excelente ejemplo.
Me gustaMe gusta
nice
Me gustaMe gusta
Excelente, muchas Gracias!
Me gustaMe gusta
Me muestra este mensaje una ves que inicie sesion en la pagina ingreso.php alguna idea de porque?
Notice: Use of undefined constant usuario – assumed ‘usuario’ in C:xampphtdocsfunciones.php on line 31
Me gustaMe gusta
no entendi lo que dice diego si lo copio tal cual no me va a servir??
lo que quiero hacer es que cada usuario tenga su pagina web algo asi como nombre: luis password luis y que me entre a la pagina luis.php y asi para cada usuario .. todavia no he podido 😦 si alguien tiene alguna ayuda … me seria de gran utilidad gracias…
Me gustaMe gusta
muchas gracias por el tutorial, excelente la explicación, muy practica y entendible; lo felicito por este gran aporte y espero que continue realizando estos aportes que son de gran ayuda para aquellos que no tiene gran conocimiento en algunos temas de programación en php
Me gustaMe gusta
gracias por su colaboracion, mire Yo trabajo directamente en el hosting y en el momento requiero accesar una base de datos donde pueda visualizar mi estado de cuenta;
en el momento hay una tabla en excel, ya estoy mirando como exportarla a sql y si me pudiese colaborar lo que necesito son las instrucciones para incluirlas dentro de la pagina.
Mil gracias y espero en adelante poder colaborar.
Gerardo Arias
Me gustaMe gusta
Muy Pobre, realmente no sirve como ejemplo o tuto, deberia completarse. En realidad son lineamientos o ideas de como hacer algo, pero esta muy lejos de un ejemplo al no ser completo, al margen de saber o no sobre PHP.
Me gustaMe gusta
muchas gracias de verdad
Me gustaMe gusta
buenas tardes, tengo el mismo problema que presentó Lila (January 15, 2012 at 17:12) pero veo que ya lo resolvió, ¿Me podrían decir como lo resolvió?
GRACIAS!
Me gustaMe gusta
Excelente aporte. Muchas Gracias
Me gustaMe gusta
excelente amigo me sirvio de mucho, una pequeña consulta como hago un select que me devuelva valores a una tabla ?
Me gustaMe gusta
olle lila como quitaste ese error yo no puedo :s
Me gustaMe gusta
Muchas Gracias por el tutorial me sirvio mucho 😀
Me gustaMe gusta
Hola
Si alguno se le presenta este error :
Notice: Use of undefined constant usuario – assumed ‘usuario’ in C:xampphtdocssesionfunciones.php on line 30
La solución es: la palabra usuario de la linea 30 de código del archivo funciones.php debe ir dentro de comillas sencillas, quedaría así:
if ($_SESSION[‘usuario’])
Espero sea de ayuda…. la solución la vi en http://www.didjeram.com/blog/2009/01/notice-use-of-undefined-constant/
Chao 🙂
Me gustaMe gusta
tengo un peqeño conflicto solo al validar la contraseña se que en la validación, no me manda a la pagina de inicio
este es mi codigo de validacion
———————————
prueba.php
Me gustaMe gusta
Me funciono excelente! por eso me tome el tiempo de dejar este comentario 🙂
Me gustaMe gusta
MUY MUY BUEN APORTE, PERO QUIERO QUE ME SIRVA PARA DOS TIPOS DE USUARIOS (ADMINISTRADOR, OPERARIO) COMO HAGO LA COMPARACIÓN DE ELLOS?
Me gustaMe gusta
tengo un problema cuando cuando lo subo a internet no me funciona , pero si me funciona en mi localhost de mi pc
Warning: Missing argument 3 for conexiones(), called in /home/oirsapla/public_html/index2.php on line 9 and defined in /home/oirsapla/public_html/funciones.php on line 3
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/oirsapla/public_html/funciones.php on line 13
Warning: Missing argument 3 for conexiones(), called in /home/oirsapla/public_html/index2.php on line 12 and defined in /home/oirsapla/public_html/funciones.php on line 3
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/oirsapla/public_html/funciones.php on line 13
Warning: Missing argument 3 for conexiones(), called in /home/oirsapla/public_html/index2.php on line 14 and defined in /home/oirsapla/public_html/funciones.php on line 3
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/oirsapla/public_html/funciones.php on line 13
Warning: Cannot modify header information – headers already sent by (output started at /home/oirsapla/public_html/funciones.php:3) in /home/oirsapla/public_html/index2.php on line 18
Me gustaMe gusta
Que tal. Quería saber como puedo hacer con este ejemplo, para abrir un formulario que por un archivo php me envía los datos que se completaron a un mail que le configuré.
El problema es que en este ejemplo, no me deja colocarle el formulario dentro de
<?php
include ('funciones.php');
//uso de la funcion verificar_usuario()
if (verificar_usuario())
{
//si el usuario es verificado puede acceder al contenido permitido a el
print "Hola $_SESSION[usuario]Ingresa a otra parte del sistema si deseas clic aqui«;
print «Desconectarse aqui«;
}
else
{
//si el usuario no es verificado volvera al formulario de ingreso
header(‘Location:index.php’);
}
?>
Me da error en la primer línea al intentar poner la pagina ahí dentro.
Como puedo hacer para que funcione? Porque si pongo que abra directamente el formulario en otra pagina, funciona todo menos la sesión. Y lo que mas necesito es que cuando me envíen el formulario, me indique qué usuario fue el que lo lleno y al volver, que me siga manteniendo la sesión por si el mismo usuario tiene que llenar el formulario varias veces y no tenga que loguearse cada vez que lo tiene que llenar.
Saludos y muchas gracias por el tutorial!
Me gustaMe gusta
Gracias por el aporte!!
Me gustaMe gusta
quiero validar el Email para entrar a gran DT
Me gustaMe gusta
me salen estos errores
Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at C:AppServwwwcontroldeusuariosindex2.php:1) in C:AppServwwwcontroldeusuariosfunciones.php on line 19
Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at C:AppServwwwcontroldeusuariosindex2.php:1) in C:AppServwwwcontroldeusuariosfunciones.php on line 19
Warning: Cannot modify header information – headers already sent by (output started at C:AppServwwwcontroldeusuariosindex2.php:1) in C:AppServwwwcontroldeusuariosindex2.php on line 9
alguien podria ayudarme
Me gustaMe gusta
Muy buenos días. En mi aplicación Web tengo usuarios que pueden tener varios niveles para entrar a la misma. Como puedo hacer para que según el nivel conque entre le salga solo el menú correspondiente. es decir tengo usuario que pueden ser profesor y jefe de dpto, pero para cada caso existen menú diferente. Espero haberme explicado y que tenga alguna sugerencia. Gracias y su ejemplo es entendible, lo voy aplicar. Felicitaciones
Me gustaMe gusta
hola una consulta urgente!!! alguien lo tiene funcionando 100% , necesito si me lo pueden pasar urgentee!! muchas gracias!
Me gustaMe gusta
Muchísimas gracias!!
Me gustaMe gusta
Gracias por el tutorial!!, será muy util para mi proyecto 😀
Me gustaMe gusta
Hola muy buenos dias!!
Soy nueva este ramo, y me gustaria me pudieses asesorar con unas dudas que me han surgido y no tengo quien sepa de esto y mucho menos quien me pueda ayudar quisiera ver si usted me pudiese asesorar…
Hice una pagina en dreamweaver y trabaje la estructura visual en html pero quiero enlazarlo a una base de datos ya que genere un formulario pero ya ahí no puedo avanzar y por lo poco que he entendido necesito crear una parte en PHP para poder hacerla conexión…
Le agradezco su atención a esta petición.
Saludos cordiales…
Me gustaMe gusta
Excelente, me funciono de maravilla gracias por compartir se va a favoritos.
Me gustaMe gusta