セッション

Flexagon のセッションは、モデルオブジェクトをサーバー側のファイルではなく 暗号化された Cookie にシリアライズします。共有のセッションストアが存在しないため、複数の Web サーバーへ水平スケールする場合でも、セッションストレージに関する追加設定は必要ありません。

設定

// application/_Config.php
_Global::$SESSION_AUTO_START      = true;
_Global::$SESSION_ENCRYPTION_STRING = Env::required('SESSION_ENCRYPTION_STRING');   // .env.php から取得
_Global::$SESSION_DOMAIN          = '.example.com';
_Global::$SESSION_TIMEOUT_SECONDS = 86400;

// Cookie のセキュリティ属性 — デフォルト値はすでに安全なため、通常は変更する必要はありません。
_Global::$SESSION_COOKIE_SECURE   = null;    // null = HTTPS リクエストでは自動的に有効化
_Global::$SESSION_COOKIE_HTTPONLY = true;    // JavaScript からセッション Cookie へのアクセスを防止
_Global::$SESSION_COOKIE_SAMESITE = 'Lax';

セッション Cookie は認証状態を保持するため、HttpOnly と SameSite=Lax がデフォルトで有効になっており、HTTPS リクエストでは Secure が自動的に付与されます。HTTPS の判定は、$_SERVER['HTTPS']、ポート 443、X-Forwarded-Proto の順に確認します。

セッションモデルと DAO

<?php
namespace Session;

use _Flexagon\Base\BaseModel;

class SessionUserModel extends BaseModel {
    private string  $role     = 'USER';
    private ?string $username = '';
    private ?string $email    = '';
    // getter / setter ...
}
<?php
namespace Session;

use _Flexagon\Base\BaseSessionDAO;

class SessionDAO extends BaseSessionDAO {}

使い方

// ログイン
$sessionUser = new SessionUserModel();
$sessionUser->setUsername($user->getUsername());
$sessionUser->setRole('ADMIN');

$sessionDAO = new SessionDAO();
$sessionDAO->makeSession($sessionUser);

// ログアウト
$sessionDAO->cleanSession();

$SESSION_AUTO_START が有効な場合、セッションはブートストラップ時に復元され、次の 2 か所で参照できます。

_Global::$SESSION_MODEL;        // 常にここで参照可能
_Global::$SESSION_USER_MODEL;   // クラス名に基づくグローバル(後述)

2 つ目の形式は、モデルのクラス名を UPPER_SNAKE_CASE に変換して導出されます(SessionUserModel → SESSION_USER_MODEL)。型ヒント付きでアクセスするには、対応する static プロパティを _Global に あらかじめ 宣言しておいてください。

class _Global extends BaseGlobal {
    public static ?\Session\SessionUserModel $SESSION_USER_MODEL = null;
}

よく使われるパターンは、_prepare.php で認可チェックを行う方法です。

<?php
// public/_prepare.php
if (str_starts_with(_Global::$URL_PARAM->filePath, 'admin/')) {
    if (_Global::$SESSION_USER_MODEL?->getRole() !== 'ADMIN') {
        \_Flexagon\Libs\HtmlUtil::redirectPage('/login');
    }
}

注意: セッションモデルのプロパティに @encrypt を付けると、Cookie 内で二重に暗号化されます。セッション Cookie 全体はすでに $SESSION_ENCRYPTION_STRING で暗号化されているため、通常この追加のアノテーションは不要です。