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

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

ただいまの
回答率

90.48%

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    2000questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Laravel

    697questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

LaravelのMulti-Authでログイン直後に別のguardのログイン画面に飛ばされる

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 790

workr

score 150

Laravel 5.4 標準の Multi-Auth 機能を利用して、2系統のログイン処理を実装しました。

両方をログイン、ログアウトを繰り返しているとまれに正しいパスワードでログインボタンを押すと別のguardのログイン画面に飛ばされてしまうことがあります。

この時ログイン自体は成功しているので、URL手入力で本来のログイン後のアドレスに移動すると正しくログインできていることが確認できます。

LoginController にはそれぞれ適切な $redirectTo プロパティを設定してあります。メソッド guard() もオーバーライド済みです。

以下が再現手順です。

  1. ガード users のログイン画面とガード admins のログイン画面を別のタブで開いておく
  2. ガード users でログインする
  3. ログアウトする
  4. ガード admins のタブでログインをしようとすると Token Mismatch エラー
  5. 一旦ブラウザバックして admins のログイン画面を再読込した上で再度ログインする
  6. users のログイン画面に飛ばされる(adminsとしてはログインできている)

ログイン失敗時の遷移先については app/Exceptions/Handler.php の unauthenticated() を改造しています。

        $guard = array_get($exception->guards(), 0);

        if($guard == 'admins') {
            $route = 'admin.login';
        } else {
            $route = 'login';
        }
        return redirect()->guest(route($route));

何か解決する方法や原因を絞り込む手がかりなどはないでしょうか?
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • aro10

    2017/09/06 20:32

    記載のPHPコードは、App\Exception\Handlerのrenderの修正部分ということでしょうか。どこのコードかを記載するとより適切な回答を得やすいかと思います。

    キャンセル

  • workr

    2017/09/07 09:59

    App\Exceptions\Handler の unauthenticated() メソッドです。ログイン周りは「artisan make:auth」コマンドを利用しています。

    キャンセル

回答 2

0

Multi-Auth 機能はあまり使っていませんが、session設定をデータベースにすると内容確認がわかりやすいかと思いますが、
手がかりとしては、同一ブラウザでは別タブでもCookieが共有な事からセッション情報も共有されており、何かしらの競合等がしているかもしれません。
Xdebug等によるステップ実行などでデバッグしていくと解決の糸口があるかもしれません。
基本的には別分類のユーザーを同時に操作することはあまり想定されていない感じがします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

現象を誤認しているような気がします。
以下の点確認してみてください。

その1

4. ガード admins のタブでログインをしようとすると Token Mismatch エラー

このToken MismatchはCsrfトークンでエラーになってるだけじゃないでしょうか?もしそうだとするならば、この現象は本件とは無関係だと思います。認証の確認をするのに一時的にsessionのタイムアウト時間を短くしていてそのまま忘れていたというのはよくあることなので、config/session.phpのlifetimeをあわせて確認してみてはいかがでしょうか?

その2

5. 一旦ブラウザバックして admins のログイン画面を再読込した上で再度ログインする
6. users のログイン画面に飛ばされる(adminsとしてはログインできている)

ログインには成功しているけどusers のログイン画面に行ってしまうとおっしゃっています。なので確認するべきなのはログイン成功時の遷移先だと思います。LoginControllerの$redirectToを記述されているかと思いますのでもう一度ご確認ください。

ログイン失敗時の遷移先については app/Exceptions/Handler.php の unauthenticated()とのことですが、こちらは関係ないように思います。「ログインはできている」んですし。

その3
そもそも普通にadminsの方でログインした後に狙ったページに遷移するんでしょうか?実はそもそもうまく動いていなかったみたいなことはよくあるかと思うので、再度確認してみてください。

蛇足
Multi-Authの場合、guardごとにLoginControllerを2種類(UserLoginControllerとAdminLoginControllerみたいな感じ)にすることもできますし、単一のLoginControllerで済ますこともできるかと思います。この辺りどのようにしているのかが不明なので、もう少し詳細を教えていただければピンポイントで回答できるかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 18:19

    LoginControllerはguardごとに2つ用意しています。それぞれ別々の$redirectToがセットされており、showLoginForm()とguard()が専用のものにオーバーライドされています。

    質問時点(2017年)では5.4を使っていましたがLaravel 5.5以降ではこの問題が発生しなくなったことから当時のバグだったのではないかと考えています。

    1. セッションに関してはデフォルトなのでlifetimeは120秒です。変更しても変化はありませんでした。

    2. 公式パッケージに更新があった影響か質問当時と少し挙動が変わりました。

    2種類のログインフォームを同時に開いておく

    usersのログイン、ログアウト

    adminsのログイン試行

    TokenMismatchのためブラウザバック

    なぜかusersのログアウト直前に見ていたページにリダイレクト
    (このページはusersとしての認証が必須ですがログアウト済みのはず)

    ブラウザ更新

    usersのログイン画面に遷移

    TokenMismatch自体の原因はログアウト時にセッションを破棄している関係上避けられないのだと思います。この挙動自体は正常と考えています。

    3. users単独、admins単独であればどちらも正常にログイン、ログアウトできます。ログインフォームを別のブラウザタブで同時に表示していたときのみ発生するようです。

    キャンセル

  • 2018/05/25 18:58

    コメントありがとうございます。
    あと気になるところでいうと、RedirectIfAuthenticatedミドルウェアあたりですかね。
    あとはキャッシュ周りも少し確認した方が良さそうな気がします。

    キャンセル

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

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

関連した質問

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

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    2000questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Laravel

    697questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。