跳至内容

DDPRateLimiter

自定义方法和订阅的限速,以避免应用程序中出现大量 WebSocket 消息。

Galaxy(Meteor 托管)提供额外的应用程序保护,了解更多 并通过我们的 免费 30 天试用 进行尝试。

默认情况下,DDPRateLimiter 配置了一个规则。此规则将登录尝试、新用户创建和密码重置限制为每个连接每 10 秒 5 次尝试。可以通过调用 Accounts.removeDefaultRateLimit() 来删除它。

要使用 DDPRateLimiter 修改默认限速规则,请在终端中将 ddp-rate-limiter 包添加到您的项目中

bash
meteor add ddp-rate-limiter

DDPRateLimiter.addRule

仅限服务器

摘要

添加一个规则,该规则与描述方法或订阅尝试的事件流匹配。每个事件都是一个具有以下属性的对象

  • type:要么是“method”,要么是“subscription”
  • name:正在调用的方法或订阅的名称
  • userId:尝试方法或订阅的用户 ID
  • connectionId:表示用户 DDP 连接的字符串
  • clientAddress:用户的 IP 地址

返回唯一的ruleId,可以将其传递给removeRulesetErrorMessageOnRule

参数

源代码
名称类型描述必填
matcher对象

匹配器指定哪些事件计入限速。匹配器是一个对象,它具有与上面描述的事件对象相同的属性子集。匹配器对象中的每个值都是以下之一

  • 字符串:要使事件满足匹配器,此值必须等于事件对象中相同属性的值

  • 函数:要使事件满足匹配器,当传递事件对象中相同属性的值时,该函数必须计算结果为真

事件的计数方式如下:每个满足匹配器过滤器的事件都映射到一个存储桶。存储桶由事件对象中匹配器和事件对象中都存在的属性的所有值唯一确定。

numRequests数字

每个时间间隔允许的请求数。默认值为 10。

timeInterval数字

以毫秒为单位的时间间隔,在此时间间隔后规则的计数器将重置。默认值为 1000。

callback函数

在规则执行后要调用的函数。

可以通过调用 DDPRateLimiter.addRule 添加自定义规则。限速器在每次方法和订阅调用时都会被调用。

当存储桶超过规则的预定义容量时,即达到限速,此时将针对该输入返回错误,直到存储桶重置。存储桶会在时间间隔结束后的定期重置。

以下是如何定义规则并将其添加到 DDPRateLimiter 中的示例

js
// Define a rule that matches login attempts by non-admin users.
const loginRule = {
  userId(userId) {
    const user = Meteor.users.findOne(userId);
    return user && user.type !== 'admin';
  },

  type: 'method',
  name: 'login'
};

// Add the rule, allowing up to 5 messages every 1000 milliseconds.
DDPRateLimiter.addRule(loginRule, 5, 1000);

DDPRateLimiter.removeRule

仅限服务器

摘要

从限速器中删除指定的规则。如果规则已达到限速,则该限制也将被删除。

参数

源代码
名称类型描述必填
id字符串

addRule 返回的“ruleId”

js
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";

/** @returns boolean */
const result = DDPRateLimiter.removeRule();
  "id"
);

DDPRateLimiter.setErrorMessage

仅限服务器

摘要

方法或订阅限速超过时设置错误消息文本。

参数

源代码
名称类型描述必填
message字符串或函数

函数在一个包含 timeToReset 字段的对象中传递,该字段指定允许下一次方法或订阅运行之前的毫秒数。该函数必须返回错误消息的字符串。

js
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";


const result = DDPRateLimiter.setErrorMessage();
  "message"
);

DDPRateLimiter.setErrorMessageOnRule

仅限服务器

摘要

为特定规则设置方法或订阅限速超过时的错误消息文本。

参数

源代码
名称类型描述必填
ruleId字符串

addRule 返回的 ruleId

message字符串或函数

函数在一个包含 timeToReset 字段的对象中传递,该字段指定允许下一次方法或订阅运行之前的毫秒数。该函数必须返回错误消息的字符串。

js
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";


const result = DDPRateLimiter.setErrorMessageOnRule();
  "ruleId",
"message",
);

允许开发人员为每个规则指定自定义错误消息,而不是仅限于每个规则一个全局错误消息。它增加了对触发哪些错误的规则的一些清晰度,从而可以获得更好的用户体验,并且还可以为每个规则提供可国际化的错误消息,而不是默认的英文错误消息。

这是一个带有自定义错误消息的示例

js
const setupGoogleAuthenticatorRule = {
  userId(userId) {
    const user = Meteor.users.findOne(userId);
    return user;
  },
  type: 'method',
  name: 'Users.setupGoogleAuthenticator',
};

// Add the rule, allowing up to 1 google auth setup message every 60 seconds
const ruleId = DDPRateLimiter.addRule(setupGoogleAuthenticatorRule, 1, 60000);
DDPRateLimiter.setErrorMessageOnRule(ruleId, function (data) {
  return `You have reached the maximum number of Google Authenticator attempts. Please try again in ${Math.ceil(data.timeToReset / 1000)} seconds.`;
});

或者更简单的方法

js
const ruleId = DDPRateLimiter.addRule(setupGoogleAuthenticatorRule, 1, 60000);
DDPRateLimiter.setErrorMessageOnRule(ruleId, 'Example as a single string error message');