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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Laravel 5

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

Q&A

解決済

1回答

723閲覧

PHP Laravel5.5 TokenMismatchExceptionとAuthenticationExceptionの動きを合わせたい

byth_net

総合スコア12

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/05/30 07:46

編集2019/05/30 07:48

環境

PHP 7.3.4
Laravel 5.5
⇒マルチログインを実装済

前提・実現したいこと

前提・実現したいこと
CSRF対策で、NGになった場合に、セッション切れと同じ動きにしたい。
(通常利用するユーザとしては、セッション切れの際に、CSRFとみなされたように見えてしまうため。)

セッション切れになった場合は、ログイン画面へリダイレクトしています。
マルチログインのため、どちらのログイン画面へ遷移すればよいかを、
AuthenticationException->guards()によって判定しています。

ソース

App\Exception

Handler.php

1class Handler extends ExceptionHandler 2{ 34 public function render($request, Exception $exception) 5 { 6 // POSTの場合AuthenticationExceptionがthrowされる前に、 7 // TokenMismatchExceptionが発生するため、ここで捕捉する。 8 if ($exception instanceof TokenMismatchException) { 9 // CSRFトークンが一致しなかった際にthrowされるExceptionを判別し、処理を切り分ける。 10 // セッションが紐づかない為、Auth::user()->guard()では、デフォルト(guardA)がとれてしまい、 11 // 必ずguardA_loginへ遷移してしまう。 12 // リクエスト先で必要とされているguardを取得して指定したい。 13 14 return $this->unauthenticated($request, new AuthenticationException('', array(Auth::user()->guard()))); 15 } 16 } 17 18 19 // GETの場合は、$exception->guards()に想定通りの値が入った状態で、ここにくる。 20 public function unauthenticated($request, AuthenticationException $exception) 21 { 22 if (in_array('GuardA', $exception->guards())) { 23 return redirect()->guest(route('guardA_login')); 24 } 25 return redirect()->guest(route('guardB_login')); 26 } 27}

routes\

web.php

1Route::post('/login_A', 'LoginController@login')->name('guardA_login'); 2Route::post('/login_B', 'LoginController@login')->name('guardB_login'); 3 4Route::group(['middleware' => 'auth:GuardA'], function () { 5 // ここの処理で発生したのか? 6 7}); 8 9Route::group(['middleware' => 'auth:GuardB'], function () { 10 // ここの処理で発生したのか? 11});

試したこと

GETの時は、うまくいっているので、Framework側でAuthenticationException throw時の記述を見ればなにかヒントを得られるかと思いましたが、わかりませんでした。
どうかお力添えください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

判別としては、URLやルート名で判別するやり方もあります。

Route::is('sometext/*') Request::routeIs('welcome');

using Request::is() function with named Routes Laravel

投稿2019/05/30 12:18

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byth_net

2019/05/31 09:13

お世話になります。 今回URLを分けていたので、この方法でできるかと思い試してみました。 恐らくLaravelの仕組みだとは思うのですが、unauthenticatedにきた際に、そのURLを記憶して次回ログイン時にアクセスする仕組みになっているようで、この仕組みが邪魔をしてうまく実装することができませんでした。 (POSTしたアドレスにGETでアクセスしてしまう) とはいえ、URLでの判断はいろいろな箇所で使えそうです。 有益な情報ありがとうございました。 まずは、ご報告まで。
byth_net

2019/06/05 10:42

悩み過ぎたので、放置してたのですが、 よくよく考えたらunauthenticatedを介さずにredirectすれば良いだけでした。 しかもunauthenticatedを掘り下げてみると、redirect()->guest();にしているから元の画面に戻ろうとしているということが分かりました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問