質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.55%

Fuelphp 1.8, php 7.2でSessionが使えない?

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,796

sumo-tori

score 5

 前提・実現したいこと

PHPやFWのバージョンも古くなってきたので、バージョンアップを行っているのですが、
下記のような環境でSessionを利用してログインユーザの情報を各ページで使いまわしたいと思ってます。

  • Amazon Linux
  • PHP7.2
  • Fuelphp1.8
  • MySQL

 発生している問題・エラーメッセージ

ログイン画面にてIDとパスワードを入力し、DB上のユーザ情報と照合して、ログイン成功した場合にSessionへ
該当ユーザの情報をセットし、別の画面にて同じ情報を取得して利用したいのですが、これまで検証した結果、別画面へ遷移した際にセッションが消えてしまいます。。。 

 該当のソースコード

# ログイン時のセッションへのセットの仕方
$user = \Model\User::login($account, $password);

if ($user === false) {
        return false;
}

$login_user = [
                'user_id'      => $user['id']
                ,'user_name'    => $user['user_name']
                ,'mail_address' => $user['mail_address']
);
Session::set('login_user', $login_user);
# セッションへのセット後の処理 ※リダイレクトしてます。
Response::redirect($acces_url);
# リダイレクト先の処理
// セッションの取得
$login_user = Session::get('login_user', null);
// セッションが存在しない場合は未ログイン
if( $login_user === null ){
    // Log::debug("セッションが存在しない場合は未ログイン");
    return false;
}
# fuel/app/config/session.php
return array(
        /**
         * global configuration
        */

        // set it to false to prevent the default session from being automatically created and started when accessing the
        // Session class. Note that if you no, your session may expire prematurely as it is no longer automatically updated
        // on every page load when you (auto) load the Session class!
        'auto_initialize'       => true,

        // set it to false to prevent manually created session instances from being autostarted when they are created
        'auto_start'            => true,

        // if no session type is requested, use the default
        'driver'                        => 'redis',

        // check for an IP address match after loading the cookie (optional, default = false)
        'match_ip'                      => false,

        // check for a user agent match after loading the cookie (optional, default = true)
        'match_ua'                      => true,

        // cookie domain  (optional, default = '')
        'cookie_domain'         => '',

        // cookie path  (optional, default = '/')
        'cookie_path'           => '/',

        // cookie http_only flag  (optional, default = use the cookie class default)
        'cookie_http_only'      => null,

        // whether or not to encrypt the session cookie (optional, default is true)
        'encrypt_cookie'        => true,

        // if true, the session expires when the browser is closed (optional, default = false)
        'expire_on_close'       => false,

        // session expiration time, <= 0 means 2 years! (optional, default = 2 hours)
        'expiration_time'       => 7200,

        // session ID rotation time  (optional, default = 300) Set to false to disable rotation
        'rotation_time'         => 300,

        // default ID for flash variables  (optional, default = 'flash')
        'flash_id'                      => 'flash',

        // if false, expire flash values only after it's used  (optional, default = true)
        'flash_auto_expire'     => false,

        // if true, a get_flash() automatically expires the flash data
        'flash_expire_after_get' => true,
        // for requests that don't support cookies (i.e. flash), use this POST variable to pass the cookie to the session driver
        'post_cookie_name'      => '',

        // for requests in which you don't want to use cookies, use an HTTP header by this name to pass the cookie to the session driver
        'http_header_name' => 'Session-Id',

        // if false, no cookie will be added to the response send back to the client
        'enable_cookie' => true,

        // if true, session data will be synced with PHP's native $_SESSION, to allow easier integration of third-party components
//      'native_emulation'      => false,
        'native_emulation'      => true,

        /**
         * specific driver configurations. to override a global setting, just add it to the driver config with a different value
        */

        // special configuration settings for cookie based sessions
        'cookie'                        => array(
                'cookie_name'           => 'fuelcid',                           // name of the session cookie for cookie based sessions
                                                ),

        // specific configuration settings for file based sessions
        'file'                          => array(
                'cookie_name'           => 'fuelfid',                           // name of the session cookie for file based sessions
                'path'                          =>      '/tmp',                                 // path where the session files should be stored
                'gc_probability'        =>      5,                                              // probability % (between 0 and 100) for garbage collection
                                                ),

        // specific configuration settings for memcached based sessions
        'memcached'                     => array(
                'cookie_name'           => 'fuelmid',                           // name of the session cookie for memcached based sessions
                'servers'                       => array(                                       // array of servers and portnumbers that run the memcached service
                                                                'default' => array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),
                                                        ),
                                                ),

        // specific configuration settings for database based sessions
        'db'                    => array(
                'cookie_name'           => 'fueldid',                           // name of the session cookie for database based sessions
                'database'                      => null,                                        // name of the database name (as configured in config/db.php)
                'table'                         => 'sessions',                          // name of the sessions table
                'gc_probability'        => 5,                                           // probability % (between 0 and 100) for garbage collection
                                                ),

        // specific configuration settings for redis based sessions
        'redis'                 => array(
                'cookie_name'           => 'fuelrid',                           // name of the session cookie for redis based sessions
                'database'                      => 'default',                           // name of the redis database to use (as configured in config/db.php)
                                                ),
);

 試したこと

 補足情報(FW/ツールのバージョンなど)

色々と試しているうちにログを吐いてみたら、ログイン時のセッションIDがリダイレクト先でセッションから情報取得をしようとした際に、
IDが変わっていたことが確認できました。
それが原因なのかなーとは思ってますが、どう対応すればよいかわからず、、、、投稿しました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

リダイレクトによってセッションが再生成されるのが原因の様に思います。

http(ログイン画面) -> https(遷移先画面) のようになっていませんでしょうか?
あるいは、遷移元と遷移先が違うサブドメインのURLとか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/03 12:59

    ご回答ありがとうございます!
    おっしゃる通り、リクエストする度に再生成されてしまっていたことが確認できました。
    その上で毎回生成するのではなく、ちゃんと保存されたセッションを利用するようにするために
    調査していったところ、ログイン後に明示的に `Session::start()` してないことに気づき、
    その対応を行ったらログインができました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る