【Laravel】セッションタイムアウト後のログイン処理で前回URLに遷移するバグ修正

Laravel でセッションタイムアウト後のログイン処理で前回URLに遷移してしまうバグの修正を解説しました!

こんにちは。iQeda [@iQeeeda] です。

  1. A アカウントでログインして /hoge ページに滞在する
  2. 長時間滞在したので A はセッションタイムアウトする (トークン期限切れ)
  3. 画面をリロードするとログイン画面にリダイレクトされる
  4. B アカウントでログインする
  5. A が滞在していた /hoge に遷移してしまう

他のアカウントでログインしたにも関わらず、デフォルトのリダイレクト処理が効かない場面に遭遇しました。これは vendor/laravel/framework/src/Illuminate/Routing/Redirector.php の下記処理が原因でした。

public function intended($default = '/', $status = 302, $headers = [], $secure = null)
{
    // セッションの url.intended が残っていると $default よりそっちの URL を優先してしまう
    $path = $this->session->pull('url.intended', $default);

    return $this->to($path, $status, $headers, $secure);
}

ログイン画面のコントローラでセッション削除すれば OK です!

public function showLoginForm()
{
    // セッションタイムアウトしたとき、前回 URL 情報がセッションに残ってしまう
    // 別アカウントでログインし直した場合もその URL を見に行こうとしてしまうので削除する
    if (Session::has('url.intended')) {
        Session::forget('url.intended');
    }
    return view('auth.login');
}

No comments yet