0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】認証済みユーザーが"/register"にアクセスするとリダイレクトされるのはなぜか

Last updated at Posted at 2021-03-03

初めに

タイトルの通りです。RegisterControllerコントローラーやRegisterUsersトレイトばかりに目が向いていて、ミドルウェアという選択肢を全く考えられなかったことへの戒めに記事に残しておきます。

前提

環境

  • PHP 7.4.15
  • Laravel 6.20.16
  • laravel/ui 1.3.0

今回の認証機能はlaravel/uiの以下のコマンド

php artisan ui:auth vue

によって提供されるものをそのまま使いました。

結論

先に答えを述べて、それから何故それが答えになるのかの説明をしていきたいと思います。

結論を言いますと、App\Http\Controllers\Auth\RegisterControllerクラスのコンストラクタに

app/Http/Controllers/Auth/RegisterController.php
public function __construct()
{
    $this->middleware('guest');
}

という処理によって、guestという名前のミドルウェアが適用されているからでした。

guestミドルウェアが追加されているコントローラは、認証済みユーザーからはアクセスできないようにミドルウェアによってガードされるようになります。

ではこの処理がどのように動作しているかを見てみましょう。

ミドルウェアguest

guestミドルウェアがどんな処理を行うかはApp\Http\Kernelをみればわかります。

App\Http\Kernel

  • 適用させるミドルウェアを登録したり
  • グループ分けを行ったり
  • 今回のguestのようにミドルウェアに対して個別に呼び出しを行えるように別名を付けたり

といったミドルウェアに関する情報を扱っています。

App\Http\Kernelクラスを見てみると、

app/Http/kernel.php
// 前略
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
// 後略

$routeMiddlewareプロパティに、[ミドルウェア名 => それの実装クラス]というような形式の連想配列の形で、あるミドルウェアに対してどの実装クラスを実行するかの情報が保存されています。

このプロパティ中のguestキーに対応するものは\App\Http\Middleware\RedirectIfAuthenticatedというクラスです。

名前からして、認証済みであればリダイレクトを行うという処理を担っていることが明らかですね。

ではこのクラスの実装を見てみましょう。

RedirectIfAuthenticatedクラスの処理

app/Http/Middleware/RedirectIfAuthenticated.php
<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect(RouteServiceProvider::HOME);
        }

        return $next($request);
    }
}

コメントを省くとこれだけの処理です。

リクエストを受けたときに実行されるメソッドであるhandle()メソッドの中身を見てみましょう。

まずAuth::guard($guard)->check()で既にユーザー情報があるかを判断しています。

既にユーザー情報がある、つまりログイン済みであれば

return redirect(RouteServiceProvider::HOME)

RouteServiceProvider::HOMEにリダイレクトする、という処理を行っています。

この処理から、App\Providers\RouteServiceProviderクラスのHOME定数を変更すればリダイレクト先を変更できるということもここから読み取れますね。

ユーザー情報がまだ無ければこのミドルウェアでは何もせず、$next($response)によって次のミドルウェアへ処理を渡しています。

以上のことから、確かにこのミドルウェアによって認証済みユーザーに対してのアクセスガードが実装されていることが分かりました。

終わりに

認証済みユーザーが/registerにアクセスしたときにリダイレクトする処理は、guestミドルウェア、つまり\App\Http\Middleware\RedirectIfAuthenticatedクラスによって提供されていることが分かりました。

ここでは各処理の詳細については深くは追わず、簡略化した説明となっています。

もし各処理の詳細(たとえば、ミドルウェアの実行される流れだったり、リダイレクト関数の実装)が気になる方がいらっしゃいましたら、ぜひ一度laravelのソースコードを深堀して追ってみるという経験をなさってみてはいかがでしょうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?