天天看點

yii2 restful web服務[速率限制]

速率限制

為防止濫用,你應該考慮增加速率限制到您的API。 例如,您可以限制每個使用者的API的使用是在10分鐘内最多100次的API調用。 如果一個使用者同一個時間段内太多的請求被接收, 将傳回響應狀态代碼 429 (這意味着過多的請求)。

要啟用速率限制, [[yii\web\User::identityClass|user identity class]] 應該實作 [[yii\filters\RateLimitInterface]]. 這個接口需要實作以下三個方法:

  • ​getRateLimit()​

    ​​: 傳回允許的請求的最大數目及時間,例如,​

    ​[100, 600]​

    ​ 表示在600秒内最多100次的API調用。
  • ​loadAllowance()​

    ​: 傳回剩餘的允許的請求和相應的UNIX時間戳數 當最後一次速率限制檢查時。
  • ​saveAllowance()​

    ​: 儲存允許剩餘的請求數和目前的UNIX時間戳。

你可以在user表中使用兩列來記錄容差和時間戳資訊。 ​

​loadAllowance()​

​​ 和 ​

​saveAllowance()​

​ 可以通過實作對符合目前身份驗證的使用者 的這兩列值的讀和儲存。為了提高性能,你也可以 考慮使用緩存或NoSQL存儲這些資訊。

一旦 identity 實作所需的接口, Yii 會自動使用 [[yii\filters\RateLimiter]] 為 [[yii\rest\Controller]] 配置一個行為過濾器來執行速率限制檢查。 如果速度超出限制 該速率限制器将抛出一個 [[yii\web\TooManyRequestsHttpException]]。 你可以在你的 REST 控制器類裡配置速率限制,

public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}      
  • ​X-Rate-Limit-Limit​

    ​: 同一個時間段所允許的請求的最大數目;
  • ​X-Rate-Limit-Remaining​

    ​: 在目前時間段内剩餘的請求的數量;
  • ​X-Rate-Limit-Reset​

    ​: 為了得到最大請求數所等待的秒數。