Laravel 8.x レート制限

イントロダクション

Laravelには、簡単に使用できるレート制限の抽象化機能があり、アプリケーションのcacheと連携して、指定した時間帯のアクションを制限する簡単な方法を提供します。

Tip!! 受信HTTPリクエストのレートを制限したい場合は、レート制限ミドルウェアのドキュメントを参照してください。

キャッシュ設定

通常、レート制限では、アプリケーションのcache設定ファイルのdefaultキーで定義されているデフォルトのアプリケーションキャッシュを使用します。しかし、アプリケーションのcache設定ファイル内でlimiterキーを定義すれば、レート制限で使用するキャッシュドライバを指定できます。

'default' => 'memcached',

'limiter' => 'redis',

基本の使い方

Illuminate\Support\Facades\RateLimiterファサードを使って、レート制限を操作できます。レート制限が提供する最もシンプルなメソッドはattemptメソッドで、これは指定されたコールバックを指定された秒数でレート制限するものです。

attemptメソッドは、コールバックで利用できる残り試行回数がない場合は、falseを返し、そうでない場合には、attemptメソッドはコールバックの結果、またはtrueを返します。attempt`メソッドが受け付ける最初の引数は、レート制限の「キー」で、レート制限をかけるアクションを表す任意の文字列を指定します。

use Illuminate\Support\Facades\RateLimiter;

$executed = RateLimiter::attempt(
    'send-message:'.$user->id,
    $perMinute = 5,
    function() {
        // メッセージ送信…
    }
);

if (! $executed) {
  return 'Too many messages sent!';
}

試行回数の手動増加

レート制限を手動で操作する場合は、他にもさまざまな方法があります。たとえば、tooManyAttemptsメソッドを呼び出して、指定したレート制限キーが1分間に許可した最大試行回数を超えたかを判断できます。

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
    return 'Too many attempts!';
}

他にも、remainingメソッドを使って、指定キーの残りの試行回数を取得することも可能です。指定キーに再試行回数が残っている場合は、hitメソッドを呼び出して総試行回数を増やせます。

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
    RateLimiter::hit('send-message:'.$user->id);

    // メッセージ送信…
}

使用可能時間の判断

キーの試行回数がなくなると、availableInメソッドは試行回数が増えるまでの残り秒数を返します。

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
    $seconds = RateLimiter::availableIn('send-message:'.$user->id);

    return 'You may try again in '.$seconds.' seconds.'.
}

試行のクリア

clearメソッドを使って、任意のレート制限キーの試行回数をリセットできます。例えば、指定メッセージが受信者によって読まれたときに試行回数をリセットできます。

use App\Models\Message;
use Illuminate\Support\Facades\RateLimiter;

/**
 * メッセージを既読としてマーク
 *
 * @param  \App\Models\Message  $message
 * @return \App\Models\Message
 */
public function read(Message $message)
{
    $message->markAsRead();

    RateLimiter::clear('send-message:'.$message->user_id);

    return $message;
}

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる