FlightPHP Сесія - Легкий Обробник Сесій На Основі Файлів

Це легкий, на основі файлів, обробник сесій для Flight PHP Framework. Він надає просте, але потужне рішення для керування сесіями, з функціями, такими як неблокувальне читання сесій, необов'язкове шифрування, функція автофіксації та режим тестування для розробки. Дані сесій зберігаються у файлах, що робить його ідеальним для застосунків, які не потребують бази даних.

Якщо ви хочете використовувати базу даних, перегляньте ghostff/session плагін, який має багато з цих самих функцій, але з бекендом бази даних.

Відвідайте Github repository для повного вихідного коду та деталей.

Встановлення

Встановіть плагін через 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 is logged in!', 'user_id' => $session->get('user_id')]);
    }
});

Flight::route('/logout', function() {
    $session = Flight::session();
    $session->clear(); // Очистити всі дані сесії
    Flight::json(['message' => 'Logged out successfully']);
});

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 Власний ідентифікатор сесії для режиму тестування (необов'язково) Випадково згенерований, якщо не встановлено
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'); // Розшифровується при отриманні
});

Регенерація Сесії

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

Flight::route('/post-login', function() {
    $session = Flight::session();
    $session->regenerate(); // Новий ідентифікатор, зберегти дані
    // АБО
    $session->regenerate(true); // Новий ідентифікатор, видалити старі дані
});

Приклад Middleware

Захистіть маршрути з використанням автентифікації на основі сесії:

Flight::route('/admin', function() {
    Flight::json(['message' => 'Welcome to the admin panel']);
})->addMiddleware(function() {
    $session = Flight::session();
    if (!$session->get('is_admin')) {
        Flight::halt(403, 'Access denied');
    }
});

Це просто приклад використання в middleware. Для більш детального прикладу, перегляньте middleware документацію.

Методи

Клас Session надає ці методи:

  • set(string $key, $value): Зберігає значення в сесії.
  • get(string $key, $default = null): Отримує значення, з необов'язковим значення за замовчуванням, якщо ключ не існує.
  • delete(string $key): Видаляє конкретний ключ з сесії.
  • clear(): Видаляє всі дані сесії, але зберігає ту саму назву файлу для сесії.
  • commit(): Зберігає поточні дані сесії у файлову систему.
  • id(): Повертає поточний ідентифікатор сесії.
  • regenerate(bool $deleteOldFile = false): Регенерує ідентифікатор сесії, включаючи створення нового файлу сесії, зберігаючи всі старі дані, а старий файл залишається в системі. Якщо $deleteOldFile дорівнює true, старий файл сесії видаляється.
  • destroy(string $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() для очищення прострочених сесій.

Співпраця

Внески вітаються! Форкуйте repository, внесіть зміни та надішліть pull request. Повідомте про помилки або запропонуйте функції через трекер проблем Github.

Ліцензія

Цей плагін ліцензований під MIT License. Перегляньте Github repository для деталей.