2018年9月にリリースした5.7
以降、Laravelの未認証時のリダイレクトを実装する方法が変わりました。
バージョン5.6
以前は、app/Exceptions/Handler.php
のunauthenticated
関数を使っており、最近でもその方法で解説する記事も多いです。
今回は、5.7以降の実装方法について記載します。
現行版の実装方法
5.7より後(現時点では5.8)のドキュメントでは、redirectTo
関数を使う前提で説明されています。
未認証ユーザーのリダイレクト ミドルウェアが未認証ユーザーを突き止めると、ユーザーをlogin名前付きルートへリダイレクトします。この振る舞いは、app/Http/Middleware/Authenticate.phpファイルのredirectTo関数で変更できます。 Laravel 5.8 認証より引用
そのため、プロジェクトディレクトリ配下にあるapp/Http/Middleware/Authenticate.php
へ設定を追記します。
/** * AuthenticateクラスのredirectToの関数を上書きする */ protected function redirectTo($request) { return route('ルート名'); }
旧方式の記述について
5.6より前のドキュメントでは、unauthenticated
関数を使う前提で説明されています。
未認証ユーザーのリダイレクト ミドルウェアが未認証ユーザーを突き止めると、401 JSONレスポンスか、もしくはリクエストがAJAXでなければ、ユーザーをlogin名前付きルートへリダイレクトします。 この振る舞いを変更するには、app/Exceptions/Handler.phpファイルでunauthenticated関数を定義します。 Laravel 5.6 認証 より引用
マルチログイン時のリダイレクト実装例
振り分け方は5.6以前の方法と同じで、guard
の情報からリダイレクト先を指定します。
プロジェクトディレクトリ配下のapp/Http/Middleware/Authenticate.php
に次のように記載します。
今回は、次の3つの認証が存在する前提で、リダイレクト先はそれぞれログインのページです。
- admin(サービス管理者)
- shop(店舗)
- user(店舗利用者)
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Auth\Middleware\Authenticate as Middleware; class Authenticate extends Middleware { protected $guards = []; public function handle($request, Closure $next, ...$guards) { // guardを変数に退避 $this->guards = $guards; return parent::handle($request, $next, ...$guards); } protected function redirectTo($request) { // Guard名から、それぞれのルートにリダイレクトさせる if(in_array('admin', $this->guards, true)) { return route('admin.login'); } elseif (in_array('shop', $this->guards, true)) { return route('shop.login'); } elseif (in_array('user', $this->guards, true)) { return route('user.login'); } else { // 上記以外の場合は、ログインが不要なページに移動 return route('home'); } } }