0
0

【Laravel】独自の単位でリクエスト制限を設定する

Posted at

この記事では、Laravelアプリケーションで独自のID単位でリクエスト制限を設定する方法を説明します。

デフォルトでは、LaravelはIPアドレスやユーザーID単位でリクエストを制限しますが、特定のシステムIDやユーザーセッションIDに基づいてリクエストを制限することで、より細かな制御が可能になります。

今回は、セッションIDを単位で1分間に10回のリクエスト制限を設定する例を用いて具体的に解説します。

コードの説明

1. カスタムミドルウェアの作成

まず、特定のID(例としてセッションID)に基づいてリクエストを制限するためのカスタムミドルウェアを作成します。

namespace App\Http\Middleware;

use Illuminate\Routing\Middleware\ThrottleRequests;

class ThrottleRequestsByCustomID extends ThrottleRequests
{
    protected function resolveRequestSignature($request)
    {
        // ここで独自のIDを取得するロジックを追加します。例としてセッションIDを使用
        return $request->session()->getId();
    }
}

このカスタムミドルウェアは、resolveRequestSignatureメソッドをオーバーライドして、独自のID(この例ではセッションID)をリクエストの識別子として使用します。必要に応じて、セッションID以外の任意のIDに変更できます。

2. デフォルトのThrottleRequestsミドルウェアの解説

LaravelのデフォルトのThrottleRequestsミドルウェアでは、ユーザーIDやIPアドレスを使用してリクエストを制限しています。以下がそのresolveRequestSignatureメソッドのコードです。

protected function resolveRequestSignature($request)
{
    if ($user = $request->user()) {
        return $this->formatIdentifier($user->getAuthIdentifier());
    } elseif ($route = $request->route()) {
        return $this->formatIdentifier($route->getDomain().'|'.$request->ip());
    }

    throw new RuntimeException('Unable to generate the request signature. Route unavailable.');
}

このメソッドは、以下の順序でリクエストの識別子を生成します:

  • 認証されたユーザーがいる場合は、そのユーザーIDを使用します
  • 認証されたユーザーがいない場合は、ルートのドメインとリクエストのIPアドレスを使用します
  • どちらも利用できない場合は、例外をスローします

3. ミドルウェアの登録

次に、カスタムミドルウェアをアプリケーションに登録します。app/Http/Kernel.phpファイルを開き、$routeMiddlewareにカスタムミドルウェアを追加します。

protected $routeMiddleware = [
    // 他のミドルウェア
    'throttle.custom' => \App\Http\Middleware\ThrottleRequestsByCustomID::class,
];

この設定により、throttle.customというエイリアスでカスタムミドルウェアを使用できるようになります。

4. デフォルトのミドルウェア設定を変更

全てのルートに対して独自のIDに基づくリクエスト制限を適用するために、$middlewareGroupsにカスタムミドルウェアを追加します。

protected $middlewareGroups = [
    'web' => [
        // 他のミドルウェア
        \App\Http\Middleware\ThrottleRequestsByCustomID::class,
        'throttle:10,1', // 1分間に10回
    ],

    'api' => [
        \App\Http\Middleware\ThrottleRequestsByCustomID::class,
        'throttle:10,1', // 1分間に10回
    ],
];

この設定により、webおよびapiのミドルウェアグループ内のすべてのルートに対して、1分間に10回のリクエスト制限が独自のID単位で適用されます。

まとめ

この記事では、Laravelでセッション単位または独自のID単位のリクエスト制限を設定する方法を解説しました。

カスタムミドルウェアを作成し、それをアプリケーションに登録することで、特定のIDに基づくリクエストの頻度を制御できるようになります。

この設定により、過剰なアクセスを防ぎ、アプリケーションのパフォーマンスとセキュリティを向上させることができます。
必要に応じて、任意のIDに変更することで、システムの要件に柔軟に対応できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0