Laravelでアクセス制限等を行うミドルウェアの活用法

## はじめに
ミドルウェアはリクエストとレスポンスの処理の間に独自のロジックを挿入することができる便利な機能です
今回はアクセス制限を具体例として基礎知識や活用方法を記事にしていきたいと思います

## ミドルウェアとは
ミドルウェアは、HTTPリクエストからコントローラまでの間に処理を加えることです（例：アクセスする際に権限のないユーザーはアクセスできないようにする）
一般的なミドルウェアの用途には、認証（先述の例）、ログの書き込み、[CORS（Cross-Origin Resource Sharing）](https://qiita.com/att55/items/2154a8aad8bf1409db2b#cors-%E3%81%A8%E3%81%AF)の設定などがあります

## Laravelでのミドルウェアの作成方法
Laravelでは、以下のコマンドを使用して新しいミドルウェアを作成できます
```bash
php artisan make:middleware {作成するミドルウェアの名前}
```

今回は下記のように作成します
```bash
php artisan make:middleware CheckAge
```

このコマンドにより作成されたファイルを編集して、アクセス制限のロジックを追加します

## 年齢制限チェックミドルウェアの作成
上記のコマンドを実行すると下記のような内容の、`app/Http/Middleware/CheckAge.php`というファイルが追加されます

```php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        return $next($request);
    }
}
```

ここに特定の年齢以上のユーザーのみアクセスを許可するミドルウェアの例を実装してみます

```php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->age <= 18) {
            return redirect('home');
        }

        return $next($request);
    }
}
```

## ミドルウェアの登録と使用方法
作成したミドルウェアをアプリケーションに登録するには、`app/Http/Kernel.php`ファイルを編集します
このファイルには、[グローバルミドルウェア、グループミドルウェア、ルートミドルウェア](https://zenn.dev/shink32/articles/ee15cbb942c4b0#%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2)があります

### グローバルミドルウェアへの登録
グローバルミドルウェアは、すべてのHTTPリクエストに対して適用されるミドルウェアです
```php
protected $middleware = [
    // 他のミドルウェア
    // 他のミドルウェア
    // 他のミドルウェア
    \App\Http\Middleware\CheckAge::class,
];
```

### グループミドルウェアへの登録
特定のルートグループにのみ適用したい場合は`$middlewareGroups`配列に登録します

```php
protected $middlewareGroups = [
    'web' => [
        // 他のミドルウェア
        // 他のミドルウェア
        // 他のミドルウェア
        \App\Http\Middleware\CheckAge::class,
    ],
];
```

### ルートミドルウェアへの登録
特定のルートやコントローラに適用する場合は、`$routeMiddleware`配列エイリアスを登録します
```php
protected $routeMiddleware = [
  'check_age' => \App\Http\Middleware\CheckAge::class,
];
```

ルートミドルウェアに関しては、登録後にルートファイル（`routes/web.php`または`api.php`）でミドルウェアを適用します

```php
Route::get('profile', function () {
    // プロフィール表示のロジック
})->middleware('check.age');
```

上記のいずれかでミドルウェアの登録が完了し、アクセスするユーザーが18歳未満であれば対象のページにアクセスできず、リダイレクト先として指定しているhome画面へリダイレクトされます

## その他の具体例
### 認証ミドルウェア
Laravelには標準で認証ミドルウェアが含まれています
これを使用することで、認証されたユーザーのみがアクセスできるルートを設定できます
```php
Route::get('dashboard', function () {
    // ダッシュボード表示のロジック
})->middleware('auth');
```

### ログの書き込みミドルウェア
リクエストごとにログの書き込みを行うミドルウェアも作成できます

```php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Log;

class LogRequest
{
    public function handle(Request $request, Closure $next)
    {
        Log::info('Request Logged: ', ['request' => $request->all()]);
        return $next($request);
    }
}
```

## まとめ
Laravelのミドルウェアを使用することで、アプリケーションのリクエストとレスポンスの処理の間に独自のロジックを挿入し、アクセス制限や認証回り等を効率的に管理することができます
ぜひご自身のLaravelプロジェクトに適用してみてください！特に認証回りは楽になる印象です
積極的に使っていきましょう～！

## 参考リンク

https://readouble.com/laravel/8.x/ja/middleware.html

https://zenn.dev/shink32/articles/ee15cbb942c4b0