Lenguaje PHP

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 usuarios PHP y MySQL Ejemplo Completo
Niveles de usuarios PHP y MySQL Ejemplo Completo

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
Niveles de usuario PHP
Niveles de usuario PHP

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

Códigos de registro PHP responsables de almacenar el nombre de usuario, contraseña y  rol específico en la base de datos mediante la selección de nuevo usuario.
<?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

 

 

Otras Opciones de Descarga

Descargar

 

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

15 comentarios

  1. 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.

    1. 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.

      1. 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.

          1. 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.

          2. 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

          3. 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.

          4. 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

  2. Muchas gracias Néstor por compartir estos conocimientos! Gracias por estos hermosos aportes para nosotros los estudiantes. Dios te bendiga enormemente!

  3. 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?

  4. 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.

    1. 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.

  5. 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

Deja una respuesta

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

Botón volver arriba