Skip to main content

Sistema de Autenticación

El sistema INVENTO utiliza autenticación basada en sesiones PHP para controlar el acceso y gestionar roles de usuario. Esta guía explica cómo funciona el sistema de login, logout y control de acceso.

Inicio de Sesión

Formulario de Login

El sistema presenta un formulario de login simple que solicita dos campos:
1

Acceder a la página de login

Navega a http://localhost/inventario/auth/login.php en tu navegador.
2

Ingresar credenciales

Completa los campos requeridos:
  • Correo: Dirección de email del usuario registrado
  • Contraseña: Contraseña asociada a la cuenta
3

Enviar formulario

Haz clic en el botón Ingresar para autenticarte.

Estructura del Formulario

El formulario de login (auth/login.php:42-50) utiliza los siguientes campos:
auth/login.php
<form method="POST">
    <label>Correo:</label><br>
    <input type="email" name="correo" required><br><br>

    <label>Contraseña:</label><br>
    <input type="password" name="password" required><br><br>

    <button type="submit" name="login">Ingresar</button>
</form>

Proceso de Autenticación

Cuando se envía el formulario, el sistema ejecuta el siguiente proceso:

1. Validación de Credenciales

El código en auth/login.php:5-27 realiza la autenticación:
auth/login.php
if (isset($_POST['login'])) {
    $correo = $_POST['correo'];
    $password = $_POST['password'];

    $sql = "SELECT * FROM usuarios WHERE correo = '$correo'";
    $resultado = $conn->query($sql);

    if ($resultado->num_rows == 1) {
        $usuario = $resultado->fetch_assoc();

        // COMPARACIÓN DIRECTA (por ahora)
        if ($password == $usuario['contraseña']) {
            $_SESSION['usuario'] = $usuario['nombre'];
            $_SESSION['rol'] = $usuario['rol'];
            header("Location: ../index.php");
            exit();
        } else {
            $error = "Contraseña incorrecta";
        }
    } else {
        $error = "Usuario no encontrado";
    }
}
Nota de Seguridad: El sistema actualmente utiliza comparación directa de contraseñas en texto plano. En producción, se recomienda usar password_hash() y password_verify() para mayor seguridad. Consulta la guía de configuración para más detalles sobre seguridad de contraseñas.

2. Creación de Sesión

Si las credenciales son válidas, el sistema crea una sesión con dos variables importantes:
  • $_SESSION['usuario']: Almacena el nombre del usuario autenticado
  • $_SESSION['rol']: Almacena el rol (“Admin” o “Empleado”)
Estas variables de sesión se utilizan en todo el sistema para verificar la autenticación y controlar el acceso.

3. Redirección

Después de autenticarse exitosamente, el usuario es redirigido a la página principal (index.php).

Mensajes de Error

El sistema muestra mensajes específicos según el tipo de error:
Se muestra cuando el correo electrónico ingresado no existe en la base de datos. Verifica que:
  • El correo esté escrito correctamente
  • El usuario haya sido creado previamente en la tabla usuarios
Se muestra cuando el correo es válido pero la contraseña no coincide. Verifica que:
  • La contraseña esté escrita correctamente
  • No haya espacios adicionales
  • Las mayúsculas y minúsculas coincidan exactamente

Protección de Páginas

Todas las páginas del sistema están protegidas con un control de sesión. Por ejemplo, en index.php:1-8:
index.php
<?php
session_start();

if (!isset($_SESSION['usuario'])) {
    header("Location: auth/login.php");
    exit();
}
?>
Este código:
  1. Inicia la sesión PHP con session_start()
  2. Verifica si existe la variable $_SESSION['usuario']
  3. Si no existe (usuario no autenticado), redirige al login
  4. Si existe, permite el acceso a la página
Todas las páginas del sistema deben incluir este código al inicio para asegurar que solo usuarios autenticados puedan acceder.

Mostrar Información del Usuario

Una vez autenticado, puedes mostrar información del usuario en cualquier página:
<h1>Bienvenido, <?php echo $_SESSION['usuario']; ?></h1>
<p>Rol: <?php echo $_SESSION['rol']; ?></p>
Esto es útil para:
  • Personalizar la interfaz con el nombre del usuario
  • Mostrar u ocultar funcionalidades según el rol
  • Auditar acciones realizadas por usuarios específicos

Cierre de Sesión

Para cerrar la sesión, el sistema proporciona un enlace en cada página:
<a href="auth/logout.php">Cerrar sesión</a>
El archivo auth/logout.php realiza las siguientes acciones:
auth/logout.php
<?php
session_start();
session_destroy();
header("Location: login.php");
exit();
?>
Este código:
  1. Inicia la sesión para poder acceder a ella
  2. Destruye todas las variables de sesión con session_destroy()
  3. Redirige al usuario de vuelta al formulario de login
Es importante llamar a session_start() antes de session_destroy() para que PHP pueda acceder a la sesión actual.

Roles de Usuario

El sistema soporta dos roles:

Admin

Acceso completo a todas las funcionalidades del sistema:
  • Crear, editar y eliminar productos
  • Registrar entradas y salidas
  • Gestionar usuarios (futuro)

Empleado

Acceso limitado a operaciones básicas:
  • Ver productos
  • Registrar movimientos de inventario
  • Sin permisos para eliminar
Actualmente, el sistema almacena el rol pero no implementa restricciones específicas por rol. Consulta la guía de roles de usuario para más detalles sobre cómo implementar control de acceso basado en roles.

Flujo Completo de Autenticación

Seguridad de Sesiones

Para mejorar la seguridad del sistema de autenticación:
1

Regenerar ID de sesión después del login

session_regenerate_id(true);
Esto previene ataques de fijación de sesión.
2

Establecer tiempo de expiración de sesión

// En cada página protegida
if (isset($_SESSION['LAST_ACTIVITY']) && 
    (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    session_destroy();
    header("Location: auth/login.php");
    exit();
}
$_SESSION['LAST_ACTIVITY'] = time();
Las sesiones expirarán después de 30 minutos de inactividad.
3

Usar HTTPS en producción

Configura tu servidor para usar SSL/TLS y establece:
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1);

Solución de Problemas

Verifica que:
  • Todas las páginas tengan session_start() al inicio
  • No haya salida antes de session_start() (ni espacios ni HTML)
  • La configuración de PHP tenga habilitada session.auto_start o uses session_start() manualmente
Este error ocurre cuando intentas usar header() después de enviar contenido al navegador. Asegúrate de que:
  • session_start() esté en la primera línea del archivo PHP
  • No haya espacios o saltos de línea antes de <?php
  • No uses echo antes de header()
Verifica que:
  • El usuario exista en la tabla usuarios
  • La contraseña en la base de datos coincida exactamente (incluyendo mayúsculas/minúsculas)
  • La conexión a la base de datos sea exitosa
  • Revisa los errores de MySQL con $conn->error

Próximos Pasos

Gestión de Productos

Aprende a crear, editar y eliminar productos

Roles de Usuario

Entiende cómo funcionan los permisos por rol

Configuración

Configura opciones de seguridad avanzadas

Solución de Problemas

Resuelve problemas comunes de autenticación

Build docs developers (and LLMs) love