Niveles de usuarios PHP y MySQL: Ejemplo Completo
Niveles de usuarios PHP. Este tutorial le ayudara a crear inicio de sesión basado en rol de múltiples usuarios en PHP PDO y con la base de datos MySQL. Nos basaremos en una sola página de inicio de sesión y dentro de esta página se podrá elegir tres niveles: Usuarios, Personal y Administradores.
¿Cómo funciona el script Niveles de usuarios PHP?
Se utilizara un objeto de sesión diferente del nombre del rol de usuario administrador y empleado para que puedan diferenciarlo.
Si el usuario accede con sus credenciales y genera un inicio de sesión en el momento asignable nombre de objeto de sesión diferente e identifique el nombre de rol determinado.
Una vez que la sesión se crea será redirigido pasado 3 segundos a su propia página de inicio y panel de gestión según su rol de usuario.
¿Qué es el inicio de sesión de Niveles de usuarios PHP?
Por ejemplo el rol de «usuario» inicia sesión correctamente y accede a su propia página de inicio. Sin embargo, dentro de su propia página de inicio podrá gestionar sus respectivos roles como asistencias, ventas, etc., según lo asignado.
Ahora, el rol «Administrador» cuando inicia sesión tendrá mas privilegios, como crear usuarios, eliminar usuarios y será el máximo rol dentro del sistema.
Niveles de usuario PHP y MySQL: Paso a Paso
A continuación, veremos una serie de pasos en el cual explicaremos cada detalle del sistema nivel de usuarios.
a) Estructura del directorio del proyecto
Como pueden apreciar les mostrare la estructura de carpetas y archivos del sistema nivel de usuarios y posee lo siguiente:
- 8 archivos en PHP
- Fichero conexión con la base de datos
- Un archivo.sql
- Librería BootStrap
b) La Base de datos / Tabla
La base de datos usara el nombre de «php_multiplelogin
«. Además, dentro de esta base de datos crearemos una tabla con nombre «mainlogin
«, que será el encargado de almacenar todos los usuarios con sus respectivos niveles.
Veamos las consultas del fichero «php_multilogin.sql
»
CREATE TABLE `mainlogin` ( `id` int(11) NOT NULL, `username` varchar(15) CHARACTER SET latin1 NOT NULL, `email` varchar(40) CHARACTER SET latin1 NOT NULL, `password` varchar(20) CHARACTER SET latin1 NOT NULL, `role` varchar(10) CHARACTER SET latin1 NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT; INSERT INTO `mainlogin` (`id`, `username`, `email`, `password`, `role`) VALUES (11, 'admin', 'demo@www.baulphp.com', '123456', 'admin'), (12, 'test', 'test@www.baulphp.com', '123456', 'personal'); ALTER TABLE `mainlogin` ADD PRIMARY KEY (`id`); ALTER TABLE `mainlogin` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; COMMIT;
c) Fichero DBconect.php
Como su nombre lo dice, este fichero tendrá un papel fundamental y será el encargado de vincular PHP con MySQL usando el tipo de conexión PDO que es muy recomendado para seguridad en el sistema.
<?php $db_host="localhost"; //localhost server $db_user="root"; //database username $db_password=""; //database password $db_name="php_multilogin"; //database name try { $db=new PDO("mysql:host={$db_host};dbname={$db_name}",$db_user,$db_password); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOEXCEPTION $e) { $e->getMessage(); } ?>
d) Fichero index.php: Formulario login
Es el fichero principal del sistema y contendrá el formulario de inicio de sesión y mostrara tres campos básicos para poder iniciar sesión como son: Correo electrónico, Contraseña y Nivel o rol de usuario. Sin embargo, el campo de rol se usara la etiqueta SELECT para forzar al usuario a elegir un rol.
<div class="login-form"> <center><h2>Iniciar sesión</h2></center> <form method="post" class="form-horizontal"> <div class="form-group"> <label class="col-sm-6 text-left">Email</label> <div class="col-sm-12"> <input type="text" name="txt_email" class="form-control" placeholder="Ingrese email" /> </div> </div> <div class="form-group"> <label class="col-sm-6 text-left">Password</label> <div class="col-sm-12"> <input type="password" name="txt_password" class="form-control" placeholder="Ingrese passowrd" /> </div> </div> <div class="form-group"> <label class="col-sm-6 text-left">Seleccionar rol</label> <div class="col-sm-12"> <select class="form-control" name="txt_role"> <option value="" selected="selected"> - selecccionar rol - </option> <option value="admin">Admin</option> <option value="personal">Personal</option> <option value="usuarios">Usuarios</option> </select> </div> </div> <div class="form-group"> <div class="col-sm-12"> <input type="submit" name="btn_login" class="btn btn-success btn-block" value="Iniciar Sesion"> </div> </div> <div class="form-group"> <div class="col-sm-12"> ¿No tienes una cuenta? <a href="registro.php"><p class="text-info">Registrar Cuenta</p></a> </div> </div> </form> </div>
Aqui les dejare el formulario de inicio de sesión PHP:
Código index.php: Procesar el inicio de sesión
– Tendra la gran responsabilidad de iniciar sesión PHP identificando el nombre, la contraseña y el rol específico seleccionado por el usuario.
– Procesara en esta misma pagina si los datos ingreados son correctos para poder crear la sesion y redirigir a las diferentes paginas segun su rol.
<?php require_once 'DBconect.php'; session_start(); if(isset($_SESSION["admin_login"])) //Condicion admin { header("location: admin/admin_portada.php"); } if(isset($_SESSION["personal_login"])) //Condicion personal { header("location: personal/personal_portada.php"); } if(isset($_SESSION["usuarios_login"])) //Condicion Usuarios { header("location: usuarios/usuarios_portada.php"); } if(isset($_REQUEST['btn_login'])) { $email =$_REQUEST["txt_email"]; //textbox nombre "txt_email" $password =$_REQUEST["txt_password"]; //textbox nombre "txt_password" $role =$_REQUEST["txt_role"]; //select opcion nombre "txt_role" if(empty($email)){ $errorMsg[]="Por favor ingrese Email"; //Revisar email } else if(empty($password)){ $errorMsg[]="Por favor ingrese Password"; //Revisar password vacio } else if(empty($role)){ $errorMsg[]="Por favor seleccione rol "; //Revisar rol vacio } else if($email AND $password AND $role) { try { $select_stmt=$db->prepare("SELECT email,password,role FROM mainlogin WHERE email=:uemail AND password=:upassword AND role=:urole"); $select_stmt->bindParam(":uemail",$email); $select_stmt->bindParam(":upassword",$password); $select_stmt->bindParam(":urole",$role); $select_stmt->execute(); //execute query while($row=$select_stmt->fetch(PDO::FETCH_ASSOC)) { $dbemail =$row["email"]; $dbpassword =$row["password"]; $dbrole =$row["role"]; } if($email!=null AND $password!=null AND $role!=null) { if($select_stmt->rowCount()>0) { if($email==$dbemail and $password==$dbpassword and $role==$dbrole) { switch($dbrole) //inicio de sesión de usuario base de roles { case "admin": $_SESSION["admin_login"]=$email; $loginMsg="Admin: Inicio sesión con éxito"; header("refresh:3;admin/admin_portada.php"); break; case "personal"; $_SESSION["personal_login"]=$email; $loginMsg="Personal: Inicio sesión con éxito"; header("refresh:3;personal/personal_portada.php"); break; case "usuarios": $_SESSION["usuarios_login"]=$email; $loginMsg="Usuario: Inicio sesión con éxito"; header("refresh:3;usuarios/usuarios_portada.php"); break; default: $errorMsg[]="correo electrónico o contraseña o rol incorrectos"; } } else { $errorMsg[]="correo electrónico o contraseña o rol incorrectos"; } } else { $errorMsg[]="correo electrónico o contraseña o rol incorrectos"; } } else { $errorMsg[]="correo electrónico o contraseña o rol incorrectos"; } } catch(PDOException $e) { $e->getMessage(); } } else { $errorMsg[]="correo electrónico o contraseña o rol incorrectos"; } } include("header.php"); ?>
e) Fichero registro.php
Este fichero será el encargado de mostrar un formulario HTML5 que tendrá la obligación de capturar los datos del registrante para poder almacenarlo en la base de datos.
Este formulario consta de cuatro campos que son: Nombre de usuario, correo electrónico, contraseña y rol de usuario.
Código HTML5 que muestra el formulario de registro
<div class="login-form"> <center><h2>Registrar</h2></center> <form method="post" class="form-horizontal"> <div class="form-group"> <label class="col-sm-9 text-left">Usuario</label> <div class="col-sm-12"> <input type="text" name="txt_username" class="form-control" placeholder="Ingrese usuario" /> </div> </div> <div class="form-group"> <label class="col-sm-9 text-left">Email</label> <div class="col-sm-12"> <input type="text" name="txt_email" class="form-control" placeholder="Ingrese email" /> </div> </div> <div class="form-group"> <label class="col-sm-9 text-left">Password</label> <div class="col-sm-12"> <input type="password" name="txt_password" class="form-control" placeholder="Ingrese password" /> </div> </div> <div class="form-group"> <label class="col-sm-9 text-left">Seleccione tipo</label> <div class="col-sm-12"> <select class="form-control" name="txt_role"> <option value="" selected="selected"> - seleccione rol - </option> <!--<option value="admin">Admin</option>--> <option value="personal">Personal</option> <option value="usuarios">Usuarios</option> </select> </div> </div> <div class="form-group"> <div class="col-sm-12"> <input type="submit" name="btn_register" class="btn btn-primary btn-block" value="Registro"> <!--<a href="index.php" class="btn btn-danger">Cancel</a>--> </div> </div> <div class="form-group"> <div class="col-sm-12"> ¿Tienes una cuenta? <a href="index.php"><p class="text-info">Inicio de sesión</p></a> </div> </div> </form> </div><!--Cierra div login-->
Formulario de registro PHP visualmente por debajo de este tipo:
Código PHP: Proceso de formulario registro
<?php require_once "DBconect.php"; if(isset($_REQUEST['btn_register'])) //compruebe el nombre del botón "btn_register" y configúrelo { $username = $_REQUEST['txt_username']; //input nombre "txt_username" $email = $_REQUEST['txt_email']; //input nombre "txt_email" $password = $_REQUEST['txt_password']; //input nombre "txt_password" $role = $_REQUEST['txt_role']; //seleccion nombre "txt_role" if(empty($username)){ $errorMsg[]="Ingrese nombre de usuario"; //Compruebe input nombre de usuario no vacío } else if(empty($email)){ $errorMsg[]="Ingrese email"; //Revisar email input no vacio } else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ $errorMsg[]="Ingrese email valido"; //Verificar formato de email } else if(empty($password)){ $errorMsg[]="Ingrese password"; //Revisar password vacio o nulo } else if(strlen($password) < 6){ $errorMsg[] = "Password minimo 6 caracteres"; //Revisar password 6 caracteres } else if(empty($role)){ $errorMsg[]="Seleccione rol"; //Revisar etiqueta select vacio } else { try { $select_stmt=$db->prepare("SELECT username, email FROM mainlogin WHERE username=:uname OR email=:uemail"); // consulta sql $select_stmt->bindParam(":uname",$username); $select_stmt->bindParam(":uemail",$email); //parámetros de enlace $select_stmt->execute(); $row=$select_stmt->fetch(PDO::FETCH_ASSOC); if($row["username"]==$username){ $errorMsg[]="Usuario ya existe"; //Verificar usuario existente } else if($row["email"]==$email){ $errorMsg[]="Email ya existe"; //Verificar email existente } else if(!isset($errorMsg)) { $insert_stmt=$db->prepare("INSERT INTO mainlogin(username,email,password,role) VALUES(:uname,:uemail,:upassword,:urole)"); //Consulta sql de insertar $insert_stmt->bindParam(":uname",$username); $insert_stmt->bindParam(":uemail",$email); //parámetros de enlace $insert_stmt->bindParam(":upassword",$password); $insert_stmt->bindParam(":urole",$role); if($insert_stmt->execute()) { $registerMsg="Registro exitoso: Esperar página de inicio de sesión"; //Ejecuta consultas header("refresh:2;index.php"); //Actualizar despues de 2 segundo a la portada } } } catch(PDOException $e) { echo $e->getMessage(); } } } include("header.php"); ?>
f) Fichero admin_portada.php
Una vez que el rol «Administrador
» inicia sesión será redirigido a esta página que estará hecha para fines administrativos con diferentes permisos.
<body> <?php include("../header.php");?> <div class="wrapper"> <div class="container"> <div class="col-lg-12"> <center> <h1>Pagina Administrativa</h1> <h3> <?php session_start(); if(!isset($_SESSION['admin_login'])) { header("location: ../index.php"); } if(isset($_SESSION['personal_login'])) { header("location: ../personal/personal_portada.php"); } if(isset($_SESSION['usuarios_login'])) { header("location: ../usuarios/usuarios_portada.php"); } if(isset($_SESSION['admin_login'])) { ?> Bienvenido, <?php echo $_SESSION['admin_login']; } ?> </h3> </center> <a href="../cerrar_sesion.php"><button class="btn btn-danger text-left"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Cerrar Sesion</button></a> <hr> </div> <br><br><br> <div class="row"> <div class="col-lg-12"> <div class="panel panel-default"> <div class="panel-heading"> Panel de usuarios </div> <!-- /.panel-heading --> <div class="panel-body"> <div class="table-responsive"> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <th width="4%">ID</th> <th width="18%">Usuario</th> <th width="24%">Email</th> <th width="19%">Rol</th> <th width="24%">Password</th> <th colspan="2">Opciones</th> </tr> </thead> <tbody> <?php require_once '../DBconect.php'; $select_stmt=$db->prepare("SELECT id,username,email,role FROM mainlogin"); $select_stmt->execute(); while($row=$select_stmt->fetch(PDO::FETCH_ASSOC)) { ?> <tr> <td><?php echo $row["id"]; ?></td> <td><?php echo $row["username"]; ?></td> <td><?php echo $row["email"]; ?></td> <td><?php echo $row["role"]; ?></td> <td>*******</td> <td width="4%"><button class="btn btn-primary"><span class="glyphicon glyphicon-edit" aria-hidden="true"></span></button></td> <td width="7%"><button class="btn btn-danger"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button></td> </tr> <?php } ?> </tbody> </table> </div> <!-- /.table-responsive --> </div> <!-- /.panel-body --> </div> <!-- /.panel --> </div> </div> </div> </body>
g) Fichero cerrar_sesion.php
Si cualquier usuario que desea salir del sistema y cerrar sesión correctamente con el objeto de sesión, deben hacer clic en el enlace de cierre de sesión llamado «Cerrar sesión
«. Por lo tanto, en ese momento el método «session_destroy()
» destruye el objeto de sesión y se envían a la página de inicio de sesión.
<?php session_start(); header("location:index.php"); // Destruye la sesion actual session_destroy(); ?>
Otros archivos: Niveles de usuarios PHP
I) DBconect.php – En este archivo establecer la conexión de la base de datos desde PHP.
II) Registro.php (formulario de registro) – Nuevo usuario (admin/personal/usuario) se está registrando en este archivo.
III) Admin_portada.php – En este archivo sólo se permite el nombre del rol de administrador.
IV) Personal_portada.php – En este archivo sólo se permite el nombre del rol de administrador de empleados. Este almacén de archivos en la carpeta de empleados.
V) Usuarios_portada.php – en este archivo sólo se permite el nombre del rol de administrador de usuario. Este almacén de archivos en la carpeta de usuario.
CONCLUSION DEL ARTÍCULO
En este artículo hemos aprendido a iniciar sesión con diferentes roles de usuarios usando PHP y MySQL. Además, estos usuarios dispondrán de diferentes permisos para poder gestionar la información del sistema web.
También, se aplicó la conexión recomendada con MySQL, estamos hablando de PHP PDO.
Espero que este ejemplo les ayude en sus proyectos web que estén realizando.
DESCARGAR CODIGO FUENTE
Niveles de Usuarios PHP Mysql: Descargar
Otras Opciones de Descarga
Descargar
Buenas!
Tengo un problema y es que a la hora de encriptar la contraseña con su ejemplo que tiene en la web, al tener que elegir el tipo de rol cuando vas a hacer login, da igual cual rol elijas que siempre va a logearse y no se como hacer para que cuando elijas uno y verifique la contraseña te lleve a distinta pagina como hace este multiusuarios sin tener cifrada la contraseña.
Gracias y saludos.
Hola Alberto
Cada usuario que se registra en base de datos (admin o personal) se le asigna un rol en especifico y cuando el usuario hace trata de iniciar sesión accederá a su respectivo rol y el sistema redireccionará a la pagina con el rol accedido.
Espero haber ayudado.
Hola Nestor,
Creo que no me expliqué bien, eso funciona perfectamente, el problema es cuando cifras con cifrado la contraseña, que ahí no se como hacer que funcione el login cuando eliges el rol, ya que al cifrarla no detecta la contraseña en el login cifrada.
Gracias y un cordial saludo.
Hola Alberto
Actualmente en el script no se ha cifrado la contraseña porque el articulo estaba enfocado al rol de usuario.
Ahora, si deseas cifrar la contraseña puedes usar password_hash , aquí tengo un artículo completo que cifra contraseña y hace login con una verificación con MySQL.
https://www.baulphp.com/cifrar-contrasenas-usando-php-pdo-completo/
Saludos
Ese tutorial es el que he seguido pero con los roles ya que necesito esto para un trabajo de clase. El problema es que no se como hacer que cuando encriptas la contraseña y creas el verifica.php, como hacer para que si eres admin te redirija a una pagina y si eres personal o usuario a sus respectivas paginas, ya que todo pasa por el fichero verifica.php.
Gracias y saludos.
Hola Alberto,
En la consulta SQL para el login, justamente en esa consulta se tiene que agregar una condicional IF ELSE para validar el rol de usuario.
Verifica.php
while($login=$resultado->fetch(PDO::FETCH_ASSOC)) {
if(password_verify($password, $login[‘password’])) {
/*
aqui se podra crear sesiones y la condicional para el ROL de usuarios
*/
$contador++;
}
}
Saludos
Lo que tu me comentas de las sesiones es lo que llevo intendando hacer pero no me funciona nada y me estoy volviendo loco ya que tengo que entregar este proyecto en una semana y necesito conseguir que cuando eliges admin a la hora de logear o usuario o personal, accedar y redirija a una pagina propia en el archivo verifica.php.
¿Podria ayudarme porfavor?
Gracias y un saludo.
Hola Alberto
1. En la tabla usuarios tiene que poseer los campos básicos como ser: usuario, contraseña y rol de usuario
2. Haciendo uso de un formulario que contenga: usuario, contraseña y rol, esta información ingresada por el usuario se envía a verifica.php
3. En verifica.php tienes que realizar la consulta SQL por ejemplo
$sql = » select * from usuarios where usuario=’usuario’ and password = ‘password’ and rol=’rol'»;
Una ves recuperado la información de la consulta y si es verdadera haciendo uso de una condicional IF ELSE se redirecciona a la pagina que corresponde al ROL
Ejemplo:
if($rol[«rol»]==»admin»){
header(«Location: admin.php»);
}elseif($rol[«rol»]==»vendedor»){
header(«Location: ventas.php»);
}
Si tienes dudas, contactame por este medio
https://www.baulphp.com/contactanos/
Saludos cordiales
Muchas gracias Néstor por compartir estos conocimientos! Gracias por estos hermosos aportes para nosotros los estudiantes. Dios te bendiga enormemente!
Solo funciona en local y con el navegador firefox,, con chrome sale «Inicio de sesión con exito» pero vuelve a la página de login.
He probado en servidor de producción, de pago y no funciona con ningún navegador, con todos hace lo mismo, después de poner «Inicio de sesión con exito» vuelva a la página de login. ¿Alguna solución? ¿Alguien me puede decir porque pasa esto?
A mi me pasa lo mismo.
Alguien puede dar alguna solución?
muchas gracias por el aporte , me salvaste !
Tu ejemplo es valido, pero es completamente de nivel «novato», extremadamente mucho código innecesario, todo eso se puede manejar con permisos de diferente forma, pero es algo mucho más avanzado. Saludos.
Hola Jorge
Existen muchas formas de lograr un objetivo, unos simples y otros complejos, si sabes de una forma más concreta puedes compartirlo entre todos.
Hola que gran ejercicio. En mi compu local funciona bien, pero al llevar a un servidor , realiza la validacion ingresa con exito al usuario pero no avanza a personal_portada.php , revise el header header(«refresh:3;personal/personal_portada.php») y esta bien, no se porque no funciona
Muchas gracias