DDPRateLimiter
自定义方法和订阅的限速,以避免应用程序中出现大量 WebSocket 消息。
默认情况下,DDPRateLimiter
配置了一个规则。此规则将登录尝试、新用户创建和密码重置限制为每个连接每 10 秒 5 次尝试。可以通过调用 Accounts.removeDefaultRateLimit()
来删除它。
要使用 DDPRateLimiter
修改默认限速规则,请在终端中将 ddp-rate-limiter
包添加到您的项目中
meteor add ddp-rate-limiter
DDPRateLimiter.addRule仅限服务器
仅限服务器
摘要
添加一个规则,该规则与描述方法或订阅尝试的事件流匹配。每个事件都是一个具有以下属性的对象
type
:要么是“method”,要么是“subscription”name
:正在调用的方法或订阅的名称userId
:尝试方法或订阅的用户 IDconnectionId
:表示用户 DDP 连接的字符串clientAddress
:用户的 IP 地址
返回唯一的ruleId
,可以将其传递给removeRule
和setErrorMessageOnRule
参数
源代码名称 | 类型 | 描述 | 必填 |
---|---|---|---|
matcher | 对象 | 匹配器指定哪些事件计入限速。匹配器是一个对象,它具有与上面描述的事件对象相同的属性子集。匹配器对象中的每个值都是以下之一
事件的计数方式如下:每个满足匹配器过滤器的事件都映射到一个存储桶。存储桶由事件对象中匹配器和事件对象中都存在的属性的所有值唯一确定。 | 是 |
numRequests | 数字 | 每个时间间隔允许的请求数。默认值为 10。 | 是 |
timeInterval | 数字 | 以毫秒为单位的时间间隔,在此时间间隔后规则的计数器将重置。默认值为 1000。 | 是 |
callback | 函数 | 在规则执行后要调用的函数。 | 是 |
可以通过调用 DDPRateLimiter.addRule
添加自定义规则。限速器在每次方法和订阅调用时都会被调用。
当存储桶超过规则的预定义容量时,即达到限速,此时将针对该输入返回错误,直到存储桶重置。存储桶会在时间间隔结束后的定期重置。
以下是如何定义规则并将其添加到 DDPRateLimiter
中的示例
// 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 | 字符串 |
| 是 |
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";
/** @returns boolean */
const result = DDPRateLimiter.removeRule(
"id"
);
DDPRateLimiter.setErrorMessage仅限服务器
仅限服务器
摘要
方法或订阅限速超过时设置错误消息文本。
参数
源代码名称 | 类型 | 描述 | 必填 |
---|---|---|---|
message | 字符串或函数 | 函数在一个包含 | 是 |
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";
DDPRateLimiter.setErrorMessage(
"message"
);
DDPRateLimiter.setErrorMessageOnRule仅限服务器
仅限服务器
摘要
为特定规则设置方法或订阅限速超过时的错误消息文本。
参数
源代码名称 | 类型 | 描述 | 必填 |
---|---|---|---|
ruleId | 字符串 |
| 是 |
message | 字符串或函数 | 函数在一个包含 | 是 |
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";
DDPRateLimiter.setErrorMessageOnRule(
"ruleId",
"message",
);
允许开发人员为每个规则指定自定义错误消息,而不是仅限于每个规则一个全局错误消息。它增加了对触发哪些错误的规则的一些清晰度,从而可以获得更好的用户体验,并且还可以为每个规则提供可国际化的错误消息,而不是默认的英文错误消息。
这是一个带有自定义错误消息的示例
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.`;
});
或者更简单的方法
const ruleId = DDPRateLimiter.addRule(setupGoogleAuthenticatorRule, 1, 60000);
DDPRateLimiter.setErrorMessageOnRule(ruleId, 'Example as a single string error message');