๐ 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:
adminyusuario). - ✅ 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()ypassword_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