El panel utiliza autenticación basada en sesiones PHP nativas. No existe ningún framework de autenticación externo: el estado del usuario se almacena enDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/jpbarbatic/webapp/llms.txt
Use this file to discover all available pages before exploring further.
$_SESSION['usuario'] tras verificar las credenciales contra la base de datos con password_verify. Cada controlador protegido delega la verificación de sesión y permisos a includes/backend.php, que actúa como un guard centralizado.
Flujo de login
El usuario accede a public/index.php
index.php es el punto de entrada de la aplicación. Inicia la sesión y comprueba si $_SESSION['usuario'] ya existe:dashboard/. Si no lo está, renderiza el formulario de login (html/login.html.php) y limpia cualquier mensaje flash pendiente.El formulario envía un POST a public/login.php
El formulario de
login.html.php hace POST a login.php con los campos email y password. Si la petición no es POST, el script termina inmediatamente:login.php busca el usuario por email
Se abre una conexión PDO y se ejecuta una consulta preparada para buscar el usuario:El uso de sentencias preparadas garantiza que el valor de
$_POST['email'] nunca se interpola directamente en el SQL, previniendo inyección SQL.Verificación de contraseña y creación de sesión
Si se encontró el usuario, se verifica la contraseña con
password_verify, que compara el texto plano introducido con el hash almacenado en la base de datos (generado con password_hash):session_regenerate_id(true) regenera el ID de sesión y destruye la sesión antigua, protegiendo contra ataques de session fixation. A continuación se almacenan el registro completo del usuario y sus permisos en sesión, y se redirige a la página principal.Datos en sesión
Tras un login exitoso, la sesión contiene dos claves principales:$_SESSION['usuario'] — Array asociativo con la fila completa del usuario de la base de datos:
| Campo | Tipo | Descripción |
|---|---|---|
id | int | Identificador único del usuario |
nombre | string | Nombre del usuario |
apellidos | string | Apellidos del usuario |
email | string | Dirección de correo electrónico (usada como login) |
telefono | string | Número de teléfono de contacto |
id_rol | int | Identificador del rol asignado al usuario |
password | string | Hash bcrypt de la contraseña (no se debe exponer) |
$_SESSION['permisos'] — Array de objetos de permiso obtenidos por obtener_permisos_rol($db, $id_rol). Cada elemento tiene la estructura:
| Campo | Tipo | Descripción |
|---|---|---|
id | int | Identificador del permiso |
nombre | string | Nombre del permiso en formato modulo.accion (p. ej. usuarios.consulta) |
obtener_permisos_rol realiza un JOIN entre roles_permisos y permisos:
Guard pattern: backend.php
Todos los controladores protegidos del panel incluyenbackend.php como primera instrucción y reciben la conexión PDO a través de su valor de retorno:
session_start()— reanuda la sesión PHP persistente del usuario.- Comprobación de
$_SESSION['usuario']— si no existe, el usuario no está autenticado y se redirige aURL_BASE(la raíz del panel, que muestra el login). db_open()— crea la conexión PDO usando las constantes definidas enconfig.php(DB_TYPE,DB_HOST,DB_PORT,DB_USER,DB_PASS,DB_NAME).obtener_permisos_rol()— recarga los permisos desde la base de datos en cada petición, garantizando que los cambios de rol surtan efecto de inmediato.- Comprobación de permiso — si el controlador declaró
$permisoantes delrequire_once, verifica que ese permiso está en$_SESSION['permisos']. Si no, termina condie('No tienes permiso'). return $db— devuelve la conexión PDO al controlador invocante.
Control de acceso por rol
Las páginas que requieren un permiso específico declaran la variable$permiso antes de incluir backend.php. De esta forma el guard puede leer su valor y aplicar la comprobación RBAC:
modulo.accion. Los permisos existentes en la aplicación incluyen, entre otros:
usuarios.consultausuarios.edicionproductos.consultacategorias.consulta
html/nav.html.php) también usa este sistema para ocultar los enlaces a módulos para los que el usuario no tiene permisos, mediante la función auxiliar es_visible:
Cierre de sesión
public/logout.php destruye completamente la sesión y redirige al inicio:
session_unset() para limpiar todas las variables de sesión, session_destroy() para eliminar los datos del servidor y session_regenerate_id(true) para invalidar el ID de sesión anterior, evitando su reutilización.