Ticker

6/recent/ticker-posts

PHP y MySQL: Sistema de Gestión de Usuarios

 


Documentación Técnica — Sistema de Gestión de Usuarios

1. Descripción General

Aplicación web desarrollada en PHP 8.4 bajo el paradigma de Programación Orientada a Objetos (POO) con arquitectura MVC simplificada (sin capa de controladores formal, delegando la lógica a clases de servicio y archivos de vista). Utiliza MySQL como motor de persistencia, PDO para el acceso a datos con consultas preparadas, y Bootstrap 5 para la capa de presentación.

El sistema implementa autenticación basada en sesiones, control de acceso por roles (RBAC) y un dashboard administrativo.


2. Stack Tecnológico

ComponenteVersión / Tecnología
Lenguaje BackendPHP 8.4
Base de DatosMySQL (InnoDB, utf8_general_ci)
Acceso a DatosPDO con ATTR_EMULATE_PREPARES = false
FrontendBootstrap 5.3, Bootstrap Icons 1.10
Efectos UITypewriterJS
Hash de Contraseñaspassword_hash() con PASSWORD_DEFAULT (bcrypt)
Gestión de Sesión$_SESSION nativo con wrapper estático

3. Estructura del Proyecto

ds-php8-poo-login/
├── config/
│   ├── constants.php
│   └── database.php
├── classes/
│   ├── Auth.php
│   ├── Database.php
│   ├── Session.php
│   └── User.php
├── includes/
│   ├── header.php
│   └── footer.php
├── dashboard/
│   ├── index.php
│   └── users.php
├── index.php
├── login.php
├── logout.php
├── register.php
├── profile.php
├── style.css
├── database.sql
└── insert_data.sql

4. Patrones de Diseño y Arquitectura Aplicados

4.1 Patrón Singleton (implícito en sesión estática)

La clase Session expone métodos estáticos (set, get, delete, destroy, setFlash, getFlash) que actúan como fachada única sobre $_SESSION. Esto centraliza el acceso al estado de sesión y evita manipulación directa del array superglobal.

4.2 Patrón Data Mapper / Active Record parcial

La clase User encapsula todas las operaciones sobre la tabla usuarios, incluyendo su mapeo al modelo de dominio (rol_nombre, password, activo). Cada instancia abre su propia conexión PDO mediante (new Database())->connect() en el constructor.

4.3 Patrón Front Controller (implícito)

Cada archivo de la raíz (index.php, login.php, register.php, profile.php) actúa como punto de entrada que:

  1. Carga dependencias (require_once).
  2. Ejecuta guardias de autenticación (Auth::requireLogin(), Auth::requireAdmin(), Auth::redirectIfLoggedIn()).
  3. Procesa la lógica del formulario si $_SERVER['REQUEST_METHOD'] === 'POST'.
  4. Renderiza la vista mediante includes/header.php y includes/footer.php.

4.4 Patrón Flash Message

Session::setFlash($type, $message) almacena un mensaje de un solo uso en $_SESSION['flash']. Session::getFlash() lo consume y elimina, garantizando la visualización única en la siguiente petición (patrón Post/Redirect/Get).

4.5 Patrón Helper estático (Auth)

La clase Auth implementa predicados de autorización (isLoggedIn, isAdmin, isUser) y guardias de acceso (requireLogin, requireAdmin, redirectIfLoggedIn).

4.6 Filtrado de salida y sanitización

Uso consistente de htmlspecialchars() en todas las vistas para prevenir XSS. Las consultas SQL utilizan PDO con parámetros vinculados para prevenir SQL Injection.


5. Modelo de Base de Datos

5.1 Diagrama relacional

roles (1) ────< (N) usuarios
  • roles.id → PK
  • usuarios.rol_id → FK hacia roles.id con ON DELETE RESTRICT

5.2 Tabla roles

ColumnaTipoRestricciones
idINTPK, AUTO_INCREMENT
nombreVARCHAR(50)NOT NULL, UNIQUE
descripcionTEXT—
creado_enTIMESTAMPDEFAULT CURRENT_TIMESTAMP

5.3 Tabla usuarios

ColumnaTipoRestricciones
idINTPK, AUTO_INCREMENT
nombreVARCHAR(100)NOT NULL
emailVARCHAR(100)NOT NULL, UNIQUE
passwordVARCHAR(255)NOT NULL (hash bcrypt)
rol_idINTNOT NULL, FK → roles(id)
activoBOOLEANDEFAULT TRUE
creado_enTIMESTAMPDEFAULT CURRENT_TIMESTAMP
actualizado_enTIMESTAMPDEFAULT CURRENT_TIMESTAMP ON UPDATE

5.4 Índices

  • idx_usuarios_email sobre usuarios(email) — optimiza login() y emailExists().
  • idx_usuarios_rol_id sobre usuarios(rol_id) — optimiza conteos por rol.

5.5 Datos Semilla

Roles:

idnombredescripción
1administradorPrivilegios totales
2usuarioPermisos limitados
3invitadoPermisos mínimos

Usuarios demo (contraseña: admin123, hash bcrypt $2y$12$...):

  • admin@demo.com → rol 1
  • juan@demo.com, maria@demo.com, ana@demo.com → rol 2
  • carlos@demo.com → rol 3

Observación técnica: El insert_data.sql inyecta IDs explícitos en roles, por lo que un reinicio del AUTO_INCREMENT no reasignará IDs distintos. Sin embargo, no se reinicia AUTO_INCREMENT de usuarios, lo cual es correcto para el flujo.


6. Disponible

Link disponible para descarga código fuente

Publicar un comentario

0 Comentarios