ラボ > FuelPHP:セッション

FuelPHP セッションキーからセッション取得したい

単純に「\Session::get(〇〇〇)」が出来ないとき。具体的に言うと・・・ajaxが絡むとき。

作成日:2018-05-31, 更新日:2019-03-19

基本

1.セッションのコンフィグファイルを読み込む
2.セッションのコンフィグファイルを元にセッションを読み込んでくる。
※決めうちでいくならコンフィグファイルを読み込む必要無し。

▼ひとまずMODELに作成したファイル

<?php
namespace Model;
class Session extends \Model {
  
  /** セッションキーから値を取得 **/
  public static function getFromKey($sessionKey='') {
    $config = self::getConfig();
    
    // セッションデータは「DBの場合、カラム:payload」「ファイルの場合、配列のインデックス:1」
    $payload = false;
    
    // driverからセッションをまるっと取得
    switch ( $config['driver'] ) {
      case 'file': // ファイルの場合
        $session = self::fromFile($config['file']), $sessionKey);
        if ( is_array($session) && 1 < count($session) ) {
          $payload = $session[1];
        }
      break;
      
      default:
        return false;
      break;
    }
    
    return $payload;
  }
  
  // ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
  
  /** セッションのコンフィグの読み込み **/
  public static function getConfig() {
    \Config::load('session', true);
    return \Config::get('session', array());
  }
  
  /** セッションキーを元にセッションを保存したファイルを読み込む **/
  public static function fromFile($config=array(), $sessionKey='') {
    $path = $config['path'] . '/' . $config['cookie_name'] . '_' . $sessionKey;
    
    if ( \File::exists($path) ) {
      $content = \File::read($path, true);
      if ( $content === false ) {
        return false;
      }
      
      return unserialize($content);
    }
    else {
      return false;
    }
  }
}

▼セッションをマルっと取得

// $sessionId = \Session::key(); // 自分自身のセッションキーを取得
$sessionId = 〇〇〇〇;
$session = \Model\Session::getFromKey($sessionId);

仮案:ajaxが絡むとき

セッションキーからセッションデータを探してこなくても普通に取れた・・・。

・ajax→FuelPHPにアクセスのときに
・FuelPHPで「\Session::get(〇〇〇)」がそのまま使えた。

これが
・FuelPHPが勝手に良い感じにしてくれている結果だからなのか、
・ajax送信時にFuelPHPのCSRF対策をいれている結果だからなのか、
・・・ってのは不明。

とりあえず「\Session::get(〇〇〇)」がそのまま使えた。

没・2018/06/01:ajaxが絡むとき

以下は、「\Session::get(〇〇〇)」がそのまま使えると気付くまでの没案。
※セッションキーをそのまま使うってのがイヤだったので・・・「\Session::get(〇〇〇)」がいけるという可能性を示唆され・・・気づいた。

基本:ajaxが絡むとき:没・2018/06/01

・送信側(ajax)にセッションキーを埋め込む
・受信側(FuelPHP)で受け取ったセッションキーを元にセッションを取得

これだけで十分なのか、不十分なのかが分からない・・・。

仮案:ajaxが絡むとき:没・2018/06/01

・送信側(ajax)にセッションキーとCSRFのトークンを埋め込む
・受信側(FuelPHP)で受け取ったセッションキーとCSRFのトークンを元にゴニョゴニョする

やりたいこと

そもそもだけど・・・ajaxのときにログインチェックを走らせたい。
でも、ログインチェックに必要な情報はセッションを利用している。
・・・困った。

という状況。

手ごろな情報が見つけられずに考えてみた。

CSRFチェックとセッションの確認

流れとしては・・・
1.CSRFチェックを行う
2.セッションキーを元にセッションを取得する
3.セッションを元にログインチェックを行う
4.やりたい処理を実行する

CSRFチェックの結果 セッションの取得結果 処理の結果
OK OK ログインチェック→やりたい処理
OK NG 「セッションエラーがありました。再度、お試しください。」とメッセージ
NG - 「セッションエラーがありました。再度、お試しください。」とメッセージ

気になる点

「画面を表示」してから「ajax実行」するまでに「セッションID」は変わらないのか?

「セッションID」は「アクセスがあったとき、一定時間経過」で変更すると思われる。
「一定時間経過」ってのが困る・・・。

・「画面を表示」するときに「\Session::rotate()」して、強制的に「セッションID」を変更

ってのを入れておくのが無難と思われる。