【Laravel】Laravel 5.7以降の未認証ユーザーのリダイレクト実装方法

2018年9月にリリースした5.7以降、Laravelの未認証時のリダイレクトを実装する方法が変わりました。
バージョン5.6以前は、app/Exceptions/Handler.phpunauthenticated関数を使っており、最近でもその方法で解説する記事も多いです。

今回は、5.7以降の実装方法について記載します。

現行版の実装方法

5.7より後(現時点では5.8)のドキュメントでは、redirectTo関数を使う前提で説明されています。

readouble.com

未認証ユーザーのリダイレクト
ミドルウェアが未認証ユーザーを突き止めると、ユーザーを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関数を使う前提で説明されています。

readouble.com

未認証ユーザーのリダイレクト
ミドルウェアが未認証ユーザーを突き止めると、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');
        }

    }
}

©︎2017-2018 WebSandBag