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

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

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

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

PHP

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

Q&A

解決済

1回答

8336閲覧

laravelマルチ認証での未ログイン時にリダイレクト先を分ける

creative_09

総合スコア80

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/07/04 03:00

Laravelでマルチ認証を使用しています。
admin、userでそれぞれ、認証が必要なページの場合にリダイレクトを設定したいです

認証が必要なページのコントローラーへ

public function __construct() { $this->middleware('auth:admin'); }

のような形で指定しています。
auth.phpにもガードとしてadminを設定しています。

未ログイン時にログイン認証が必要なページにアクセスした時のそれぞれのログインページへのリダイレクト先を指定するために
app/Http/Middleware/Authenticate.phpで

protected function redirectTo($request) { ルーティングに応じて未ログイン時のリダイレクト先を振り分ける if (!$request->expectsJson()) { if (Route::is('admin.order')) { return route($this->admin_route); } elseif (Route::is('admin.product')) { return route($this->admin_route); } elseif (Route::is('user')) { return route($this->user_route); } elseif (Route::is('user.order')) { return route($this->user_route); } } }

などとして、振り分けているのですが、
この場合だと、ルートごとに指定しているので、
コントローラーでadminの認証が必要だった場合などは
ルートに関わらず、すべてadmin.loginへリダイレクト、
userの認証が必要だった場合はuser.loginへリダイレクトという形にしたいのですが、
こういった場合は、ここで指定をどのようにかえればよいのでしょうか?
また、middlewareを作成するほうが良いのでしょうか?

よろしくお願いいたします

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

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

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

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

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

guest

回答1

0

ベストアンサー

このミドルウェアにはパラメタでどのガードを使うつもりだったのかが渡されているのですが、redirectToには渡ってこないので惜しい感じなのでそのあたりを改造するのはどうでしょうか。

\App\Http\Middleware\Authenticateの親クラスの\Illuminate\Auth\Middleware\Authenticateを見ると以下のようになっています。

php

1 /** 2 * Handle an unauthenticated user. 3 * 4 * @param \Illuminate\Http\Request $request 5 * @param array $guards 6 * @return void 7 * 8 * @throws \Illuminate\Auth\AuthenticationException 9 */ 10 protected function unauthenticated($request, array $guards) 11 { 12 throw new AuthenticationException( 13 'Unauthenticated.', $guards, $this->redirectTo($request) 14 ); 15 } 16 17 /** 18 * Get the path the user should be redirected to when they are not authenticated. 19 * 20 * @param \Illuminate\Http\Request $request 21 * @return string|null 22 */ 23 protected function redirectTo($request) 24 { 25 // 26 }

つまりredirectToの手前のunauthenticatedまでは$guardsパラメタが渡ってきているので、\App\Http\Middleware\Authenticate側で上書きしてこんな感じにします。

php

1 protected function unauthenticated($request, array $guards) 2 { 3 throw new AuthenticationException( 4 'Unauthenticated.', $guards, $this->redirectToByGuards($request, $guards) 5 ); 6 } 7 8 protected function redirectToByGuards($request, $guards) { 9 if (!$request->expectsJson()) { 10 if ($guards[0] === 'admin') { 11 return route($this->admin_route); 12 } else { 13 return route($this->user_route); 14 } 15 } 16 }

投稿2020/07/04 03:45

編集2020/07/04 07:07
crhg

総合スコア1177

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

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

creative_09

2020/07/04 04:17

ありがとうございます。 guardが渡っている部分での上書きで処理するのですね。 大変、お手数なのですが redirectToByGuardメソッドの中身の一例をお願いできないでしょうか? また、ここまでの流れを組んでいる場合に、ミドルウェアでたとえば、auth_adminなどを作成し、そちらでリダイレクトした場合も違和感のない実装となりえるのでしょうか?
crhg

2020/07/04 07:08

中身の例は回答を更新しました。 後の方の質問についてはどんなミドルウェアを作るつもりなのかがわからないとなんともいえません。
creative_09

2020/07/04 08:12

参考の回答ありがとうございます。 \App\Http\Middleware\Authenticateへ上記のコードを追記し、 コントローラー側へは public function __construct() { $this->middleware('auth:admin'); } と記述し、実行してみたところ、 Class 'App\Http\Middleware\AuthenticationException' not found となりエラーとなります。 後者の質問につきましては コントローラーのconstructに $this->middleware('auth_admin'); と記述し karnel.phpに 'auth_admin' => \App\Http\Middleware\AuthAdmin::class を記述 Middlewareとして、AuthAdmin.phpを作成し、 public function handle($request, Closure $next) { if (Auth::guard('admin')->check()) { return $next($request); } //管理者ログインページへ遷移する return redirect()->route('admin.login'); } としました。 この流れで実現はできているのですが、提示いただいたものをやってみたいのと、 おっしゃっていた、流れ的にガードを使おうとしていたものが親で止まっているとあったので、どちらが良い流れなのかも気になっています。 どちらにしても、最初に提示したコードのルートによってリダイレクト指定していたものも同時に使いたいのです。 エラーを直してどちらも検証してみたいのでよろしくお願いいたします
crhg

2020/07/04 08:16

`AuthenticationException`は`use`する必要があります。 use Illuminate\Auth\AuthenticationException; を追加してください。
creative_09

2020/07/04 08:40

ありがとうございます。 無事に思った通りの動作ができました。 ありがとうございます!! この動作のあとに protected function redirectTo($request)を通ることになるのであればその後でルートで指定したリダイレクトも可能ということですね
creative_09

2020/07/04 08:51

なぜ低評価がついているのかはわかりませんが、そんな質問に完璧な答えをありがとうございました。 ミドルウェアをあらたに設置するよりもスマートに思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問