Ejercicio 10 PHP

Curso PHP – Ejercicio 10 (Sistema de Login con Roles)

๐Ÿ” Ejercicio 10: Sistema de login con roles y permisos en PHP

๐Ÿ“Œ Planteamiento:

Crea un sistema de login en PHP que:

  • ✅ Maneje usuarios con roles (por ejemplo: admin y usuario).
  • ✅ Solo permita a los admins acceder a una pรกgina especial de administraciรณn.
  • ✅ Use $_SESSION para mantener la sesiรณn y el rol del usuario.
  • ✅ Incluya opciรณn para cerrar sesiรณn.
  • ✅ Use PDO, password_hash() y password_verify().

✅ Modelo de soluciรณn:

<?php
session_start();

// ๐Ÿ“Œ Conexiรณn a MySQL
$dsn = "mysql:host=localhost;dbname=curso_php;charset=utf8";
$usuario = "root";
$contrasena = "";

try {
    $pdo = new PDO($dsn, $usuario, $contrasena);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("❌ Error de conexiรณn: " . $e->getMessage());
}

// ๐Ÿ“Œ Crear tabla usuarios con roles si no existe
$pdo->exec("CREATE TABLE IF NOT EXISTS usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre_usuario VARCHAR(50) UNIQUE NOT NULL,
  contrasena VARCHAR(255) NOT NULL,
  rol ENUM('admin','usuario') DEFAULT 'usuario'
)");

// ๐Ÿ“Œ Crear usuario admin y usuario normal de prueba
$usuarios_demo = [
    ['admin', '1234', 'admin'],
    ['juan', 'abcd', 'usuario']
];

foreach ($usuarios_demo as $ud) {
    $stmt = $pdo->prepare("SELECT COUNT(*) FROM usuarios WHERE nombre_usuario = ?");
    $stmt->execute([$ud[0]]);
    if ($stmt->fetchColumn() == 0) {
        $hash = password_hash($ud[1], PASSWORD_DEFAULT);
        $pdo->prepare("INSERT INTO usuarios (nombre_usuario, contrasena, rol) VALUES (?, ?, ?)")
            ->execute([$ud[0], $hash, $ud[2]]);
    }
}

// ๐Ÿ“ฅ Procesar login
if (isset($_POST['login'])) {
    $stmt = $pdo->prepare("SELECT * FROM usuarios WHERE nombre_usuario = ?");
    $stmt->execute([$_POST['usuario']]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user && password_verify($_POST['contrasena'], $user['contrasena'])) {
        $_SESSION['usuario'] = $user['nombre_usuario'];
        $_SESSION['rol'] = $user['rol'];
        header("Location: dashboard.php");
        exit;
    } else {
        $error = "❌ Usuario o contraseรฑa incorrectos.";
    }
}

// ๐Ÿ“ฅ Procesar logout
if (isset($_GET['logout'])) {
    session_destroy();
    header("Location: login.php");
    exit;
}
?>

<!-- ๐Ÿ“„ FORMULARIO LOGIN -->
<?php if (!isset($_SESSION['usuario'])): ?>
  <h3>Iniciar sesiรณn</h3>
  <form method="post">
    <input type="text" name="usuario" placeholder="Usuario" required>
    <input type="password" name="contrasena" placeholder="Contraseรฑa" required>
    <button type="submit" name="login">Entrar</button>
  </form>
  <?php if (isset($error)) echo "<p style='color:red'>$error</p>"; ?>
<?php else: ?>
  <h3>Bienvenido, <?php echo $_SESSION['usuario']; ?> (<?php echo $_SESSION['rol']; ?>)</h3>
  
  <p>Esta es la pรกgina principal.</p>

  <?php if ($_SESSION['rol'] === 'admin'): ?>
      <p style="color: green;">✅ Eres ADMIN y tienes acceso a la zona de administraciรณn.</p>
      <a href="admin.php">Ir a la pรกgina de administraciรณn</a>
  <?php else: ?>
      <p style="color: orange;">⚠️ Eres un usuario normal. No tienes acceso a la zona de administraciรณn.</p>
  <?php endif; ?>

  <a href="?logout=1">Cerrar sesiรณn</a>
<?php endif; ?>
    

๐ŸŽฏ Claves de este ejercicio:

  • ๐Ÿ“ Sistema de login mรกs robusto con **roles**.
  • ๐Ÿ“ Control de acceso a pรกginas segรบn rol (admin/usuario).
  • ๐Ÿ“ Uso de sesiones para mantener tanto usuario como rol.
  • ๐Ÿ“ Preparaciรณn para ampliar a permisos mรกs complejos en proyectos reales.

No hay comentarios:

Publicar un comentario

Polรญticas de Privacidad