ウェブ制作
プログラミング
Laravel11でIpアドレス
制限をしよう!
お刺身@プログラマー
2024.12.25
#Oookey_blog_002
Laravel11はLaravel10以前と比べアプリケーション構造が変わっているところが多く、
kernelやMiddlewareで設定していたIpAdress制限は構造が変わった影響で10以前ではマストだった設定が難しいです。
しかしkernelやMiddlewareの登録方法は変わりましたが、Laravel11以降もmiddlewareでのIpAdress制限は問題なく実装できるため、本記事で説明していきます。
1. ミドルウェア作成
最初に、IP制限を行うミドルウェアを作成します。
Copied!
php artisan make:middleware CheckIp
app/Http/MiddlewareFirewall
Copied!
<?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!
<?php
return [
'IpList' => [
'127.0.0.1',
'192.168.65.1',
]
]
?>
今回はIpアドレスの保存にはconfigファイルを使っていますが、環境変数やDBでIPを管理しても良いと思います。
3. ミドルウェア名を設定
作成したミドルウェアをbootstrap/app.phpファイルに登録します。
Copied!
<?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: '*');と設定しています
4. ルートにミドルウェアを適用
ミドルウェアを適用したルートを記述します。
Copied!
Route::prefix('admin')->middleware(['Ip.check'])->group(function () {
Route::get('admin',[RegisterController::class, 'index']);
Route::post('admin',[RegisterController::class, 'store']);
});
これで設定完了です!
最後に
APP_ENV=local設定、もしくは登録されているIPだとウェルカムページが表示されます。
環境変数 APP_ENV=local以外、もしくは登録されてないIPでアクセスがあった場合403レスポンスを返してくれました!
この記事を参考にぜひIP制限を実装してみてください!