FlightPHP Sesión - Manejador de Sesiones Ligero Basado en Archivos
Esto es un plugin ligero, basado en archivos, para manejar sesiones en el Flight PHP Framework. Proporciona una solución simple pero potente para gestionar sesiones, con características como lecturas de sesiones no bloqueantes, cifrado opcional, funcionalidad de auto-commit y un modo de prueba para desarrollo. Los datos de sesión se almacenan en archivos, lo que lo hace ideal para aplicaciones que no requieren una base de datos.
Si deseas usar una base de datos, consulta el plugin ghostff/session que incluye muchas de estas mismas características pero con un backend de base de datos.
Visita el repositorio de Github para el código fuente completo y detalles.
Instalación
Instala el plugin a través de Composer:
composer require flightphp/session
Uso Básico
Aquí hay un ejemplo simple de cómo usar el plugin flightphp/session
en tu aplicación Flight:
require 'vendor/autoload.php';
use flight\Session;
$app = Flight::app();
// Registra el servicio de sesión
$app->register('session', Session::class);
// Ejemplo de ruta con uso de sesión
Flight::route('/login', function() {
$session = Flight::session();
$session->set('user_id', 123);
$session->set('username', 'johndoe');
$session->set('is_admin', false);
echo $session->get('username'); // Esto imprime: johndoe
echo $session->get('preferences', 'default_theme'); // Esto imprime: default_theme
if ($session->get('user_id')) {
Flight::json(['message' => '¡El usuario está logueado!', 'user_id' => $session->get('user_id')]);
}
});
Flight::route('/logout', function() {
$session = Flight::session();
$session->clear(); // Limpia todos los datos de sesión
Flight::json(['message' => 'Cerrado de sesión exitoso']);
});
Flight::start();
Puntos Clave
- No Bloqueante: Usa
read_and_close
para iniciar la sesión por defecto, previniendo problemas de bloqueo de sesiones. - Auto-Commit: Habilitado por defecto, por lo que los cambios se guardan automáticamente al cerrar a menos que se desactive.
- Almacenamiento en Archivos: Las sesiones se almacenan en el directorio temporal del sistema bajo
/flight_sessions
por defecto.
Configuración
Puedes personalizar el manejador de sesiones pasando un arreglo de opciones al registrar:
// Sí, es un arreglo doble :)
$app->register('session', Session::class, [ [
'save_path' => '/custom/path/to/sessions', // Directorio para los archivos de sesión
'prefix' => 'myapp_', // Prefijo para los archivos de sesión
'encryption_key' => 'a-secure-32-byte-key-here', // Habilita el cifrado (se recomienda 32 bytes para AES-256-CBC)
'auto_commit' => false, // Desactiva el auto-commit para control manual
'start_session' => true, // Inicia la sesión automáticamente (por defecto: true)
'test_mode' => false, // Habilita el modo de prueba para desarrollo
'serialization' => 'json', // Método de serialización: 'json' (por defecto) o 'php' (heredado)
] ]);
Opciones de Configuración
Opción | Descripción | Valor por Defecto |
---|---|---|
save_path |
Directorio donde se almacenan los archivos de sesión | sys_get_temp_dir() . '/flight_sessions' |
prefix |
Prefijo para el archivo de sesión guardado | sess_ |
encryption_key |
Clave para el cifrado AES-256-CBC (opcional) | null (sin cifrado) |
auto_commit |
Guarda automáticamente los datos de sesión al cerrar | true |
start_session |
Inicia la sesión automáticamente | true |
test_mode |
Ejecuta en modo de prueba sin afectar las sesiones de PHP | false |
test_session_id |
ID de sesión personalizado para el modo de prueba (opcional) | Generado aleatoriamente si no se establece |
serialization |
Método de serialización: 'json' (por defecto, seguro) o 'php' (heredado, permite objetos) | 'json' |
Modos de Serialización
Por defecto, esta biblioteca usa serialización JSON para los datos de sesión, lo que es seguro y evita vulnerabilidades de inyección de objetos PHP. Si necesitas almacenar objetos PHP en la sesión (no recomendado para la mayoría de las aplicaciones), puedes optar por la serialización PHP heredada:
'serialization' => 'json'
(por defecto):- Solo se permiten arreglos y primitivos en los datos de sesión.
- Más seguro: inmune a la inyección de objetos PHP.
- Los archivos se prefijan con
J
(JSON plano) oF
(JSON cifrado).
'serialization' => 'php'
:- Permite almacenar objetos PHP (usa con precaución).
- Los archivos se prefijan con
P
(serialización PHP plana) oE
(serialización PHP cifrada).
Nota: Si usas serialización JSON, intentar almacenar un objeto lanzará una excepción.
Uso Avanzado
Commit Manual
Si desactivas el auto-commit, debes confirmar los cambios manualmente:
$app->register('session', Session::class, ['auto_commit' => false]);
Flight::route('/update', function() {
$session = Flight::session();
$session->set('key', 'value');
$session->commit(); // Guarda explícitamente los cambios
});
Seguridad de Sesión con Cifrado
Habilita el cifrado para datos sensibles:
$app->register('session', Session::class, [
'encryption_key' => 'your-32-byte-secret-key-here'
]);
Flight::route('/secure', function() {
$session = Flight::session();
$session->set('credit_card', '4111-1111-1111-1111'); // Se cifra automáticamente
echo $session->get('credit_card'); // Se descifra al recuperar
});
Regeneración de Sesión
Regenera el ID de sesión por seguridad (por ejemplo, después de iniciar sesión):
Flight::route('/post-login', function() {
$session = Flight::session();
$session->regenerate(); // Nuevo ID, mantiene los datos
// O
$session->regenerate(true); // Nuevo ID, elimina los datos antiguos
});
Ejemplo de Middleware
Protege rutas con autenticación basada en sesiones:
Flight::route('/admin', function() {
Flight::json(['message' => 'Bienvenido al panel de administración']);
})->addMiddleware(function() {
$session = Flight::session();
if (!$session->get('is_admin')) {
Flight::halt(403, 'Acceso denegado');
}
// Esto es solo un ejemplo simple de cómo usarlo en middleware. Para un ejemplo más detallado, consulta la documentación de [middleware](/learn/middleware).
});
Métodos
La clase Session
proporciona estos métodos:
set(string $key, $value)
: Almacena un valor en la sesión.get(string $key, $default = null)
: Recupera un valor, con un valor predeterminado opcional si la clave no existe.delete(string $key)
: Elimina una clave específica de la sesión.clear()
: Elimina todos los datos de sesión, pero mantiene el mismo nombre de archivo para la sesión.commit()
: Guarda los datos de sesión actuales en el sistema de archivos.id()
: Devuelve el ID de sesión actual.regenerate(bool $deleteOldFile = false)
: Regenera el ID de sesión, incluyendo la creación de un nuevo archivo de sesión, manteniendo todos los datos antiguos y el archivo antiguo permanece en el sistema. Si$deleteOldFile
estrue
, se elimina el archivo de sesión antiguo.destroy(string $id)
: Destruye una sesión por ID y elimina el archivo de sesión del sistema. Esto forma parte de laSessionHandlerInterface
y$id
es requerido. El uso típico sería$session->destroy($session->id())
.getAll()
: Devuelve todos los datos de la sesión actual.
Todos los métodos excepto get()
y id()
devuelven la instancia de Session
para encadenamiento.
¿Por Qué Usar Este Plugin?
- Ligero: Sin dependencias externas, solo archivos.
- No Bloqueante: Evita el bloqueo de sesiones con
read_and_close
por defecto. - Seguro: Soporta cifrado AES-256-CBC para datos sensibles.
- Flexible: Opciones de auto-commit, modo de prueba y control manual.
- Nativo de Flight: Construido específicamente para el framework Flight.
Detalles Técnicos
- Formato de Almacenamiento: Los archivos de sesión se prefijan con
sess_
y se almacenan en elsave_path
configurado. Prefijos de contenido de archivo:J
: JSON plano (por defecto, sin cifrado)F
: JSON cifrado (por defecto con cifrado)P
: Serialización PHP plana (heredada, sin cifrado)E
: Serialización PHP cifrada (heredada con cifrado)
- Cifrado: Usa AES-256-CBC con un IV aleatorio por escritura de sesión cuando se proporciona una
encryption_key
. El cifrado funciona para ambos modos de serialización JSON y PHP. - Serialización: JSON es el método por defecto y más seguro. La serialización PHP está disponible para usos heredados/avanzados, pero es menos segura.
- Recolección de Basura: Implementa
SessionHandlerInterface::gc()
de PHP para limpiar sesiones expiradas.
Contribuciones
¡Las contribuciones son bienvenidas! Bifurca el repositorio, realiza tus cambios y envía una solicitud de extracción. Reporta errores o sugiere características a través del rastreador de problemas de Github.
Licencia
Este plugin está licenciado bajo la Licencia MIT. Consulta el repositorio de Github para detalles.