ウェブ制作

プログラミング

Laravel11でIpアドレス
制限をしよう!

お刺身@プログラマー

お刺身@プログラマー

#Oookey_blog_002

Laravel11でIpアドレス制限をしよう!

Laravel11はLaravel10以前と比べアプリケーション構造が変わっているところが多く、 kernelやMiddlewareで設定していたIpAdress制限は構造が変わった影響で10以前ではマストだった設定が難しいです。
しかしkernelやMiddlewareの登録方法は変わりましたが、Laravel11以降もmiddlewareでのIpAdress制限は問題なく実装できるため、本記事で説明していきます。

目次

1. ミドルウェア作成
2. IpAddress保存
3. ミドルウェア名を設定
4. ルートにミドルウェアを適用

最後に

1. ミドルウェア作成

最初に、IP制限を行うミドルウェアを作成します。

Copied!

copyBtn
php artisan make:middleware CheckIp

app/Http/MiddlewareFirewall

Copied!

copyBtn
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\IpUtils;
use Symfony\Component\HttpFoundation\Response;

class Firewall
{
    private function ipList(){
        return config('IpAddressList.IpList');
    }

    /**
    * Handle an incoming request.
    *
    * @param Request $request
    * @param Closure $next
    * @return mixed
    * @throws AuthorizationException
    */
    public function handle(Request $request, Closure $next): Response
    {
        if($this->isAllowedIp($request->ip())){
            return $next($request);
        }

        if (!is_array($this->ipList())) {
            \Log::error('Invalid IP list format', ['ipList' => $this->ipList()]);
            return false;
        }

        throw new \Symfony\Component\HttpKernel\Exception\HttpException(403, 'Access denied');
    }

    /**
    * @param string $ip
    * @return bool
    */
    private function isAllowedIp(string $ip): bool
    {
        if (app()->environment('local')) { // 開発環境では全て許可
            return true;
        }
        return IpUtils::checkIp($ip, config('IpAddressList.IpList'));
    }
}
?>

2. IpAddress保存

config/IpAddressList.phpに、許可するIPリストを記述します。

config/'IpAddressList

Copied!

copyBtn
<?php

return [
    'IpList' => [
        '127.0.0.1',
        '192.168.65.1',
    ]
]
?>

今回はIpアドレスの保存にはconfigファイルを使っていますが、環境変数やDBでIPを管理しても良いと思います。

3. ミドルウェア名を設定

作成したミドルウェアをbootstrap/app.phpファイルに登録します。

Copied!

copyBtn
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use App\Http\Middleware\Firewall;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->trustProxies(at: ['プロキシのCIDRリスト']); // AWSプロキシIPレンジを指定
        $middleware->alias([
            'Ip.check' => Firewall::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

AWSなどのロードバランサープロバイダを使用すると実際のバランサーのIPアドレスがわからない場合があるため、 $middleware->trustProxies(at: '*');と設定しています

公式の解説:https://readouble.com/laravel/11.x/ja/requests.html

4. ルートにミドルウェアを適用

ミドルウェアを適用したルートを記述します。

Copied!

copyBtn
Route::prefix('admin')->middleware(['Ip.check'])->group(function () {
    Route::get('admin',[RegisterController::class, 'index']);
    Route::post('admin',[RegisterController::class, 'store']);
});

これで設定完了です!

最後に

APP_ENV=local設定、もしくは登録されているIPだとウェルカムページが表示されます。

002_LaravelWelcomPage

環境変数 APP_ENV=local以外、もしくは登録されてないIPでアクセスがあった場合403レスポンスを返してくれました!

002_Laravel403Page

この記事を参考にぜひIP制限を実装してみてください!

お問い合わせはこちら

Oookeyは新規企画・事業の立ち上げや
プロダクトのシステム開発、
UI/UX制作など、一気通貫で
プロジェクトにコミットし伴走します。

お問い合わせフォーム

New Blog List

新着ブログ一覧

おすすめ明朝体&ゴシック体フォント12選

ウェブ制作

ウェブデザイン

おすすめ明朝体&ゴシック体
フォント12選

たまごしゃん@デザイナー

たまごしゃん@デザイナー

LaravelとGoogleチャートを組み合わせて、円グラフを表示してみよう!

ウェブ制作

プログラミング

LaravelとGoogleチャート
組み合わせて、円グラフを
表示してみよう!

カフェラテ@プログラマー

カフェラテ@プログラマー

Laravel11でIpアドレス制限をしよう

ウェブ制作

プログラミング

Laravel11でIpアドレス制限を
しよう

お刺身@プログラマー

お刺身@プログラマー

バナー作成におすすめの参考サイト

ウェブ制作

ウェブデザイン

バナー作成におすすめの
参考サイト4選

くるまちゃん@デザイナー

くるまちゃん@デザイナー

Oookey Blog 最初のごあいさつ

その他

ウェブ制作

Oookey Blog 最初の
ごあいさつ

お刺身@プログラマー

お刺身@プログラマー