FlightPHP Sesión - Controlador de Sesiones Basado en Archivos Liviano
Este es un plugin liviano de controlador de sesiones basado en archivos para el Flight PHP Framework. Proporciona una solución simple pero poderosa para gestionar sesiones, con características como lecturas de sesiones no bloqueantes, cifrado opcional, funcionalidad de auto-confirmación y un modo de prueba para el desarrollo. Los datos de la 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 tiene 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í tienes 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();
// Registrar el servicio de sesión
$app->register('session', Session::class);
// Ruta de ejemplo 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'); // Salida: johndoe
echo $session->get('preferences', 'default_theme'); // Salida: default_theme
if ($session->get('user_id')) {
Flight::json(['message' => '¡El usuario ha iniciado sesión!', 'user_id' => $session->get('user_id')]);
}
});
Flight::route('/logout', function() {
$session = Flight::session();
$session->clear(); // Limpiar todos los datos de la sesión
Flight::json(['message' => '¡Salida exitosa!']);
});
Flight::start();
Puntos Clave
- No Bloqueante: Utiliza
read_and_close
para iniciar la sesión de manera predeterminada, evitando problemas de bloqueo de sesión. - Auto-Confirmar: Habilitado por defecto, por lo que los cambios se guardan automáticamente al apagar, 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 controlador de sesiones pasando un array de opciones al registrarte:
$app->register('session', Session::class, [
'save_path' => '/custom/path/to/sessions', // Directorio para archivos de sesión
'encryption_key' => 'a-secure-32-byte-key-here', // Habilitar cifrado (32 bytes recomendados para AES-256-CBC)
'auto_commit' => false, // Desactivar auto-confirmación para control manual
'start_session' => true, // Iniciar sesión automáticamente (predeterminado: true)
'test_mode' => false // Habilitar modo de prueba para el desarrollo
]);
Opciones de Configuración
Opción | Descripción | Valor Predeterminado |
---|---|---|
save_path |
Directorio donde se almacenan los archivos de sesión | sys_get_temp_dir() . '/flight_sessions' |
encryption_key |
Clave para cifrado AES-256-CBC (opcional) | null (sin cifrado) |
auto_commit |
Guardar automáticamente los datos de la sesión al apagarse | true |
start_session |
Iniciar la sesión automáticamente | true |
test_mode |
Ejecutar en modo de prueba sin afectar las sesiones de PHP | false |
test_session_id |
ID de sesión personalizado para modo de prueba (opcional) | Generado aleatoriamente si no está configurado |
Uso Avanzado
Confirmación Manual
Si desactivas la auto-confirmación, debes confirmar manualmente los cambios:
$app->register('session', Session::class, ['auto_commit' => false]);
Flight::route('/update', function() {
$session = Flight::session();
$session->set('key', 'value');
$session->commit(); // Guardar cambios explícitamente
});
Seguridad de la Sesión con Cifrado
Habilitar 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'); // Cifrado automáticamente
echo $session->get('credit_card'); // Desencriptado al recuperar
});
Regeneración de Sesión
Regenerar 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, conservar datos
// O
$session->regenerate(true); // Nuevo ID, eliminar datos antiguos
});
Ejemplo de Middleware
Proteger rutas con autenticación basada en sesión:
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');
}
});
Este es solo un ejemplo simple de cómo usar esto en middleware. Para un ejemplo más detallado, consulta la documentación de 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 la sesión.commit()
: Guarda los datos actuales de la sesión en el sistema de archivos.id()
: Devuelve el ID de sesión actual.regenerate(bool $deleteOld = false)
: Regenera el ID de sesión, opcionalmente eliminando datos antiguos.
Todos los métodos excepto get()
y id()
devuelven la instancia de Session
para la encadenación.
¿Por Qué Usar Este Plugin?
- Liviano: 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-confirmación, 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 están prefijados con
sess_
y almacenados en elsave_path
configurado. Los datos cifrados utilizan un prefijoE
, los datos en texto plano utilizanP
. - Cifrado: Utiliza AES-256-CBC con un IV aleatorio por cada escritura de sesión cuando se proporciona una
encryption_key
. - Recolección de Basura: Implementa el
SessionHandlerInterface::gc()
de PHP para limpiar sesiones caducadas.
Contribuyendo
¡Las contribuciones son bienvenidas! Haz un fork del repositorio, realiza tus cambios y envía una solicitud de extracción. Informa sobre errores o sugiere funcionalidades a través del rastreador de problemas de Github.
Licencia
Este plugin está bajo la Licencia MIT. Consulta el repositorio de Github para detalles.