FlightPHP Session - Легковесный обработчик сессий на основе файлов

Это легковесный плагин для обработки сессий на основе файлов для Flight PHP Framework. Он предоставляет простое, но мощное решение для управления сессиями, с функциями, такими как неблокирующее чтение сессий, необязательное шифрование, автоматическая фиксация изменений и режим тестирования для разработки. Данные сессий хранятся в файлах, что идеально подходит для приложений, не требующих базы данных.

Если вы хотите использовать базу данных, ознакомьтесь с плагином ghostff/session, который имеет многие из этих функций, но с использованием базы данных.

Посетите репозиторий на Github для полного исходного кода и деталей.

Установка

Установите плагин через Composer:

composer require flightphp/session

Основное использование

Вот простой пример использования плагина flightphp/session в вашем приложении Flight:

require 'vendor/autoload.php';

use flight\Session;

$app = Flight::app();

// Регистрация сервиса сессий
$app->register('session', Session::class);

// Пример маршрута с использованием сессий
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'); // Выводит: johndoe
    echo $session->get('preferences', 'default_theme'); // Выводит: default_theme

    if ($session->get('user_id')) {
        Flight::json(['message' => 'Пользователь вошел в систему!', 'user_id' => $session->get('user_id')]);
    }
});

Flight::route('/logout', function() {
    $session = Flight::session();
    $session->clear(); // Очистить все данные сессии
    Flight::json(['message' => 'Выход выполнен успешно']);
});

Flight::start();

Ключевые аспекты

  • Неблокирующее: По умолчанию использует read_and_close для запуска сессии, предотвращая проблемы с блокировкой сессий.
  • Автоматическая фиксация: Включена по умолчанию, поэтому изменения сохраняются автоматически при завершении, если не отключена.
  • Хранение в файлах: Сессии хранятся в каталоге временных файлов системы в /flight_sessions по умолчанию.

Конфигурация

Вы можете настроить обработчик сессий, передавая массив опций при регистрации:

// Да, это двойной массив :)
$app->register('session', Session::class, [ [
    'save_path' => '/custom/path/to/sessions',         // Каталог для файлов сессий
    'prefix' => 'myapp_',                              // Префикс для файлов сессий
    'encryption_key' => 'a-secure-32-byte-key-here',   // Включить шифрование (рекомендуется 32 байта для AES-256-CBC)
    'auto_commit' => false,                            // Отключить автоматическую фиксацию для ручного контроля
    'start_session' => true,                           // Автоматически запускать сессию (по умолчанию: true)
    'test_mode' => false,                              // Включить режим тестирования для разработки
    'serialization' => 'json',                         // Метод сериализации: 'json' (по умолчанию) или 'php' (устаревший)
] ]);

Опции конфигурации

Опция Описание Значение по умолчанию
save_path Каталог, где хранятся файлы сессий sys_get_temp_dir() . '/flight_sessions'
prefix Префикс для сохраненного файла сессии sess_
encryption_key Ключ для шифрования AES-256-CBC (необязательно) null (без шифрования)
auto_commit Автоматическое сохранение данных сессии при завершении true
start_session Автоматически запускать сессию true
test_mode Запуск в режиме тестирования без влияния на сессии PHP false
test_session_id Кастомный ID сессии для режима тестирования (необязательно) Генерируется случайно, если не указано
serialization Метод сериализации: 'json' (по умолчанию, безопасный) или 'php' (устаревший, позволяет объекты) 'json'

Режимы сериализации

По умолчанию эта библиотека использует сериализацию JSON для данных сессий, что безопасно и предотвращает уязвимости, связанные с внедрением объектов PHP. Если вам нужно хранить объекты PHP в сессии (не рекомендуется для большинства приложений), вы можете выбрать устаревшую сериализацию PHP:

  • 'serialization' => 'json' (по умолчанию):
    • Допускаются только массивы и примитивы в данных сессий.
    • Безопаснее: устойчив к внедрению объектов PHP.
    • Файлы имеют префикс J (простой JSON) или F (зашифрованный JSON).
  • 'serialization' => 'php':
    • Позволяет хранить объекты PHP (используйте с осторожностью).
    • Файлы имеют префикс P (простая сериализация PHP) или E (зашифрованная сериализация PHP).

Примечание: Если вы используете сериализацию JSON, попытка сохранить объект вызовет исключение.

Продвинутое использование

Ручная фиксация

Если вы отключите автоматическую фиксацию, вам нужно вручную фиксировать изменения:

$app->register('session', Session::class, ['auto_commit' => false]);

Flight::route('/update', function() {
    $session = Flight::session();
    $session->set('key', 'value');
    $session->commit(); // Явно сохранить изменения
});

Безопасность сессий с шифрованием

Включите шифрование для конфиденциальных данных:

$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'); // Шифруется автоматически
    echo $session->get('credit_card'); // Дешифруется при извлечении
});

Регенерация сессии

Регенерируйте ID сессии для безопасности (например, после входа):

Flight::route('/post-login', function() {
    $session = Flight::session();
    $session->regenerate(); // Новый ID, сохранить данные
    // ИЛИ
    $session->regenerate(true); // Новый ID, удалить старые данные
});

Пример промежуточного ПО

Защитите маршруты с помощью аутентификации на основе сессий:

Flight::route('/admin', function() {
    Flight::json(['message' => 'Добро пожаловать в панель администратора']);
})->addMiddleware(function() {
    $session = Flight::session();
    if (!$session->get('is_admin')) {
        Flight::halt(403, 'Доступ запрещен');
    }
});

Это простой пример использования в промежуточном ПО. Для более подробного примера см. документацию по middleware.

Методы

Класс Session предоставляет эти методы:

  • set(string $key, $value): Сохраняет значение в сессии.
  • get(string $key, $default = null): Извлекает значение, с необязательным значением по умолчанию, если ключ не существует.
  • delete(string $key): Удаляет конкретный ключ из сессии.
  • clear(): Удаляет все данные сессии, но сохраняет то же имя файла для сессии.
  • commit(): Сохраняет текущие данные сессии в файловую систему.
  • id(): Возвращает текущий ID сессии.
  • regenerate(bool $deleteOldFile = false): Регенерирует ID сессии, включая создание нового файла сессии, сохраняя все старые данные, а старый файл остается в системе. Если $deleteOldFile равен true, старый файл сессии удаляется.
  • destroy(string $id): Уничтожает сессию по ID и удаляет файл сессии из системы. Это часть SessionHandlerInterface, и $id обязателен. Типичное использование: $session->destroy($session->id()).
  • getAll() : Возвращает все данные из текущей сессии.

Все методы, кроме get() и id(), возвращают экземпляр Session для цепочки вызовов.

Почему использовать этот плагин?

  • Легковесный: Нет внешних зависимостей — только файлы.
  • Неблокирующее: Избегает блокировки сессий с read_and_close по умолчанию.
  • Безопасный: Поддерживает шифрование AES-256-CBC для конфиденциальных данных.
  • Гибкий: Опции автоматической фиксации, режима тестирования и ручного контроля.
  • Flight-Native: Разработан специально для фреймворка Flight.

Технические детали

  • Формат хранения: Файлы сессий имеют префикс sess_ и хранятся в настроенном save_path. Префиксы содержимого файлов:
    • J: Простой JSON (по умолчанию, без шифрования)
    • F: Зашифрованный JSON (по умолчанию с шифрованием)
    • P: Простая сериализация PHP (устаревшая, без шифрования)
    • E: Зашифрованная сериализация PHP (устаревшая с шифрованием)
  • Шифрование: Использует AES-256-CBC с случайным IV на каждую запись сессии, когда предоставлен encryption_key. Шифрование работает как для режимов JSON, так и для PHP.
  • Сериализация: JSON — это режим по умолчанию и самый безопасный метод. Сериализация PHP доступна для устаревшего/продвинутого использования, но менее безопасна.
  • Сбор мусора: Реализует SessionHandlerInterface::gc() для очистки истекших сессий.

Вклад

Вклад приветствуется! Создайте форк репозитория, внесите изменения и отправьте пул-реквест. Сообщайте об ошибках или предлагайте функции через трекер задач на Github.

Лицензия

Этот плагин лицензирован по лицензии MIT. См. репозиторий на Github для деталей.