Laravel8でIP制限をかけるためにホワイトリスト・ブラックリストの制限を行う

Laravel8を使用していて、IPで制限をかけたい時はないでしょうか。
そんな時にLaravel8を使用したIP制限の簡単な方法を紹介します。

ブラックリストを設定する

最初のケースでは、特定のIPアドレスを持つ特定のユーザーのみをブロックします。クライアントが特定のルートを要求した場合、laravelはまずミドルウェアを経由し、その後コントローラに到達するので、このチェックを行うのに最適な場所はミドルウェアということになります。

コントローラにアクセスさせたくないユーザーがいる場合は、サイトにアクセスしようとしたときにメッセージを表示するようにします。

まず、ミドルウェアを作ります。

# sailを使用していない場合
php artisan make:middleware BlockIpAddressMiddleware

# sailを使用している場合
./vendor/bin/sail artisan make:middleware BlockIpAddressMiddleware​

「app/Http/Middleware/BlockIpAddressMiddleware.php」にミドルウェアが左右制されたと思います。このミドルウェアを修正します。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class BlockIpAddressMiddleware
{
    /**
     * @var string[]
     */
    public $blacklistIps = [
        '192.168.0.5'
    ];

    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (in_array($request->getClientIp(), $this->blacklistIps)) {
            abort(403, "You are restricted to access the site.");
        }

        return $next($request);
    }
}

新しいミドルウェアを手に入れたので、すべてのWebやapiのルートで有効化してみましょう。

すべてのroutes/web.phpは、webミドルウェアを経由します。
すべてのroutes/api.phpは、apiミドルウェアを経由します。
このように、ミドルウェアを個々のルートに追加するのではなく、グローバルに追加することで、routes/web.phpファイル内のすべてのルートに適用されるようになります。

個々のルートにミドルウェアを追加するのではなく、グローバルにミドルウェアを追加して、routes/web.phpファイル内のすべてのルートに適用されるようにします。

「app/Http/Kernel.php」を下記のように編集します。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    // other code

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            // other middlewares
            \App\Http\Middleware\BlockIpAddressMiddleware::class
        ],

        'api' => [
            // other middlewares
        ],
    ];
}

手順は以下の通りです。

192.168.0.5のIPを持つクライアントがサイトにアクセスしようとした場合
サイトにBlockIpAddressMiddlewareミドルウェアを実装したLaravelのWebサイトであるとします。
app/Http/Kernel.phpは、ユーザーのリクエストを適切に処理し、ミドルウェアを実行します。
ミドルウェアはIPをチェックし、403エラーコードと適切なメッセージを返します。
Laravelは403のデフォルトビューまたはユーザー定義の403エラービューを表示します。
クライアントはアクセスしようとする全てのページで403エラーが表示されます
別のシナリオを考えてみましょう。

あなたはLaravelアプリを開発していますが、特定のIPアドレスを持つ会社のユーザーにのみアクセスを許可し、会社以外のユーザーがステージングサーバーや開発サーバーにアクセスするのをブロックしたいとします。
このような場合、一部のIPをホワイトリストに登録し、残りのIPをブロックする必要があります。このケースのために、新しいミドルウェアを作成する方法を紹介します。

ホワイトリストを設定する

# sailを使用していない場合
php artisan make:middleware WhiteListIpAddressessMiddleware

# sailを使用している場合
./vendor/bin/sail artisan make:middleware WhiteListIpAddressessMiddleware​

「app/Http/Middleware/WhiteListIpAddressessMiddleware.php」が作成されました。
このファイルを編集してみましょう。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class WhiteListIpAddressessMiddleware
{
    /**
     * @var string[]
     */
    public $whitelistIps = [
        '192.168.0.5'
    ];

    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (!in_array($request->getClientIp(), $this->whitelistIps)) {
            abort(403, "You are restricted to access the site.");
        }

        return $next($request);
    }
}

そこで、個々のルートにミドルウェアを追加するのではなく、グローバルにミドルウェアを追加して、routes/web.phpファイル内のすべてのルートに適用されるようにします。

「app/Http/Kernel.php」ファイルを開きます。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    // other code

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            // other middlewares
            \App\Http\Middleware\WhiteListIpAddressessMiddleware::class
        ],

        'api' => [
            // other middlewares
        ],
    ];
}

ここでは、ホワイトリストに登録されているIPアドレスのみを許可し、それ以外をブロックするようにロジックを切り替えています。

今回の記事では、laravel8を使用したホワイトリスト・ブラックリストの設定の仕方を紹介しました。
チュートリアルが役に立ったというかたは、「いいね!」「コメント」「シェア」をお願いします💔