我意识到你无法真正阻止用户从控制台调用流星方法(如果我错了,请纠正我)。
我为跟踪游戏统计数据的用户提供简单的头或尾游戏,我为他们创建的两种方法是guessheads
和guessTails
。根据每个结果,我只更新这些命令中的统计信息,这样用户就无法直接更新统计数据。
统计信息存储在用户的个人资料中,由于以下代码,用户无法对其进行编辑:
Meteor.users.deny({
update() { return true; }
});
我的问题是用户仍然可以从控制台调用guessHeads
和guessTails
命令,如果复制粘贴它的工作量与简单相同,则不是真正的问题点击ui中的head or tails按钮。
但是如果他们在大循环中运行这些命令呢?我怎么能阻止他们这样做,因为它目前是可能的。
答案 0 :(得分:2)
Meteor的ddp-rate-limiter
核心软件包旨在解决此问题。
只需添加该包,然后follow the documentation添加DDPRateLimiter.addRule()
type: 'method'
guessHeads
针对guessTails
和class User
has_many :bookmarks
has_many :posts, through: :bookmarks
end
class Post
has_many :bookmarks
has_many :users, through: :bookmarks
end
class Bookmark
belongs_to :user
belongs_to :post
end
方法的规则。您可以将对这些方法的调用频率限制为适合您的应用程序需要的任何内容。
答案 1 :(得分:1)
我尝试这样的事情:
var throttledUsers = { }; // Outside of your methods but on the server. I would probably use the module pattern for this.
guessHeads() {
var currentUser = this.userId;
if(!throttledUsers[currentUser]) {
throttledUsers[currentUser] = true;
//Do your logic.
Meteor.setTimeout(function() {
delete throttledUsers[currentUser];
}, 1000); // Set the throttle timeout to whatever you want.
} else {
// Throw an exception or whatever you want.
}
}
基本上你在这里做的是创建一个对象服务器端,它可以保存在最后一秒内调用guessHeads或guessTails的用户。超时然后从对象中删除这些用户,并允许他们再次执行guessHeads和guessTails逻辑。