在Meteor中,我什么时候应该 Select method而不是deny规则?

在我看来,应该支持allow/deny规则,因为它们的目标更明确,而且人们知道在哪里可以找到它们.

然而,在《发现Meteor 》一书中,防止重复插入("重复"被定义为添加一个文档,其url属性已经在同一集合的其他文档中定义)必须通过一种方法来定义(并留给读者作为练习,第8.3章).

我认为我能够以一种更清晰的方式实施这项判断:

Posts.deny({
    update: function(userId, post, fieldNames, modifier) {
        return Posts.findOne({ url: modifier.$set.url, _id: { $ne: post._id } });
    }
});

(N.B. if you know the example, yes, I voluntarily left out the “only a subset of the attributes is modified” check from the question to be more specific.)

我知道Mongo还有update operators个而不是$set个,但它们看起来像是打印出来的,我不想留下一个安全漏洞.

那么:我的deny条规则有什么缺陷吗?独立而言,我应该 Select 一种方法吗?我能从中得到什么?我会失go 什么?

推荐答案

通常我会尽量避免主观回答,但这是一场非常重要的辩论.首先,我建议大家阅读《发现Meteor 》博客上的Meteor Methods vs Client-Side Operations篇文章.请注意,在Edthena,我们专门使用方法的原因应该显而易见.

Methods

赞成的意见

  • 方法可以正确地执行任意复杂度的模式和验证规则,而无需外部库.旁注-check是验证输入 struct 的极好工具.

  • 在应用程序中,每种方法都是唯一的真理来源.如果你创建了一个"帖子"."插入"方法,您可以轻松确保这是在应用程序中插入帖子的唯一方法.

骗局

  • 方法需要命令式的样式,而且它们往往与操作所需的验证次数有关.

Client-side Operations

赞成的意见

  • allow/deny有一个简单的声明式风格.

骗局

  • 验证update操作的架构和权限非常困难.如果需要强制实施模式,则需要使用外部库,如collection2.仅仅这个原因就应该让你停下来.

  • 修改可以散布到你的应用程序中.因此,确定特定数据库操作发生的原因可能很困难.


Summary

在我看来,allow/deny在美学上更令人愉悦,但它的根本弱点是强制执行权限(尤其是在更新上).我建议在以下情况下进行客户端操作:

  • 您的代码库相对较小,因此很容易对出现特定修改器的所有实例进行grep.

  • 你们并没有太多的开发者——所以你们不需要所有人都同意,只有一种方法可以插入到X个集合中.

  • 你有简单的权限规则——例如,只有文档的所有者才能修改文档的任何方面.

在我看来,当构建一个MVP时,使用客户端操作是一个合理的 Select ,但我会切换到所有其他情况下的方法.


update 2/22/15

萨什科·斯图巴约创造了一个赞成的意见posal to replace allow/deny with insert/update/remove methods米的世界.

update 6/1/16

Meteor 向导的位置是allow/deny should always be avoided.

Mongodb相关问答推荐

在MongoDB中是否可以按递增顺序更新多个文档?

如何根据两个 struct 创建一个Mongo文档?

更快地识别嵌套对象数组中具有重复字段的文档

Golang:如何判断 collection.Find 是否没有找到任何文件?

MongoDB:嵌套数组计数+原始文档

在 MongoDB 中加入多个集合

MongoDB乘以对象值?

删除一对一和一对多引用 - Mongoose

Meteor 中的平均聚合查询

为什么mongodb的文档中存储键名

使用 MongoDB C# 驱动程序在嵌套数组上使用过滤器生成器进行查询

如何使用 Node.js 和 mongoose 解决command find requires authentication?

try 解析序列化 JSON 字符串时处理 MongoDB 的 ISODate()

单个模式数组中的多个模式引用 - mongoose

MongoDB 数据库,相当于 SELECT column1, column2 FROM tbl

在 Mongo 中,$near 和 $nearSphere 有什么区别?

如何在 Meteor 应用程序之间共享 MongoDB 集合?

使用 mongoengine 将多文档插入到 mongodb

如何在 Ubuntu 10.04 中使用 --auth 选项重新启动 mongodb?

如何在 Mongoid 中引用嵌入的文档?