我应该使用服务器方法或Collection.insert()来使用Meteor插入记录吗?

时间:2014-05-26 14:48:17

标签: security meteor

我正在尝试使用Meteor.js在客户端中将新文档插入集合的两种方法之间做出决定。调用服务器方法或直接使用db API。

所以,我可以直接在客户端访问db api:

MyCollection.insert(doc)

或者,我可以创建一个新的服务器方法(在/server目录下):

Meteor.methods({
  createNew: function(doc) {
    check(doc, etc)
    var id = MyCollection.insert(doc);
    return project_id;
  }
});

然后从客户端调用它:

Meteor.call('createNew', doc, function(error, result){
  // Carry on
});

两者都有效,但就我在测试中看到的情况而言,如果直接点击db api,我只会受益于延迟补偿(本地缓存更新并在服务器响应之前在屏幕上显示),而不是我使用服务器方法,所以我倾向于以这种方式做事。但我也得到的印象是最安全的方法是在服务器上使用一个方法(主要是因为Emily Stark在她的视频here中将其作为示例)但是无论什么时候客户端都可以使用db api那么为什么服务器方法会更好?

我在其他地方阅读源代码时看到了两种方法,所以我很难过。

请注意。在这两种情况下,我都有适当的允许/拒绝规则:

MyCollection.allow({
  insert: function(userId, project){
    return isAllowedTo.createDoc(userId, doc);
  },
  update:  function(userId, doc){
    return isAllowedTo.editDoc(userId, doc);
  },
  remove:  function(userId, doc){
    return isAllowedTo.removeDoc(userId, doc);
  }
});

简而言之:建议使用哪种?为什么?

1 个答案:

答案 0 :(得分:0)

问题是我在/server文件夹下有方法声明,因此客户端无法使用它们,这打破了延迟补偿(客户端创建这些方法的存根以模拟操作但在我的案件不能,因为它看不到它们)。将它们移出此文件夹后,我能够以干净,安全和延迟补偿的方式使用服务器方法(即使我的所有Allow / Deny规则都设置为false - 它们什么也不做,只适用于直接从db api访问客户端,而不是服务器。)

简而言之:不要在客户端上使用db api或在服务器上使用/拒绝规则,忘记它们曾经存在并只编写服务器方法,确保客户端和服务器都可以访问它们,并使用这些反而是为了crud。