ミドルウェアのカスタム

自作のミドルウェア

Laravelのミドルウェアは自作可能です。ここでは、usersテーブルにis_adminという管理者用のフラグを追加し、管理者のみがアクセスできるページを作成します。以前、マイグレーションの変更方法でusersテーブルにis_adminを追加したので、これを使用します。追加していない場合は、以前の解説の通りにis_adminを追加してください。

次に以下のコマンドで自作のミドルウェアを追加します。

php artisan make:midlleware AdminMiddleware

上記のコマンドを実行すると、app/Http/MiddlewareにAdaminMiddleware.phpが追加されます。以下のようにコードを追加します。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        if (Auth::check() && !Auth::user()->is_admin) {
            return redirect("/");
        }

        return $next($request);
    }
}

Auth::checkメソッドでユーザーがログインしているか確認し、Auth::user()->is_adminでユーザーが管理者かどうか確認します。ユーザーがログイン中で、管理者でない場合、http://localhostにリダイレクトします。$nextを実行して、次のミドルウェアを呼び出します。

ミドルウェアの登録

次に自作したミドルウェアを登録します。bootstrap/app.phpのwithMiddlewareにミドルウェアのクラスとその名前を登録します。以下のように登録します。

    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            "admin" => AdminMiddleware::class,
        ]);
    })

ここでは、adminという名前で、AdminMiddlewareクラスを指定しています。

コントローラー、ビュー、ルーティングの作成

今回のミドルウェアの挙動をテストするコントローラー、ビュー、ルーティングを作成します。コントローラーとビューに関しては簡単なもので構いません。ここでは解説を割愛します。ルーティングは以下のように行います。

Route::middleware("admin")->get("/admin/admin-page",[AdminController::class, "showAdaminPage"]);

middlewareメソッドで適応するミドルウェアを指定しています。今回はadminミドルウェアをテストしたいのでそれを指定しています。あとは、http://localhost/admin/admin-pageに接続すると指定したビューが表示されるようにしています。

管理者ユーザーの作成

管理者ユーザーを作成します。usersテーブルはパスワードを保持しており、そのパスワードはハッシュ化されています。MySQL自体にハッシュ化の機能がないため、Laravelでハッシュ化する必要があります。ハッシュ化のプログラムを記述して実行してもよいですが、ここでは対話型のtinkerを使用します。PHPサーバーにログインし、以下のコマンドでtinkerを立ち上げます。

php artisan tinker

tinkerを起動すると対話型のシェルが起動されるので以下のコマンドを順番に実行して管理者ユーザーを作成します。

use App\Models\User;
$user = new User();
$user->name = "admin";
$user->email = "admin@example.com";
$user->password = Hash::make("password");
$user->is_admin = true;
$user->save();

上記のコマンドは、まず初めにUserモデルを呼び出し、次に新しいUserモデルのインスタンスを作成し、そのインスタンスに値を追加して、saveメソッドでデータベースにセーブしています。上記と同じように、is_adminがfalseのテストユーザーも作成しましょう。手順は上記と同じです。

挙動のテスト

まずは、テストユーザーでログインします。次に、http://localhost/admin/admin-pageに接続します。http://localhostにリダイレクトされれば成功です。次に、管理者ユーザーでログインします。先ほどと同じようにhttp://localhost/admin/admin-pageに接続します。指定したビューが表示されれば成功です。

以上で、ミドルウェアをカスタムすることができました。

今回はミドルウェアのカスタムを行いました。ミドルウェアは柔軟性が高いので、様々な場面で活躍すると思います。

前:

次:

コメントを残す

CAPTCHA