你如何保护客户端MongoDB API?

TK4*_*421 31 meteor

我不希望我的所有用户都能够插入/销毁数据.

n1m*_*mmy 33

虽然还没有记录的方法可以做到这一点,但这里有一些代码可以做你想要的:

Foo = new Meteor.Collection("foo");
...
if (Meteor.is_server) {
   Meteor.startup(function () {
       Meteor.default_server.method_handlers['/foo/insert'] = function () {};
       Meteor.default_server.method_handlers['/foo/update'] = function () {};
       Meteor.default_server.method_handlers['/foo/remove'] = function () {};
   });
}
Run Code Online (Sandbox Code Playgroud)

这将禁用默认的插入/更新/删除方法.客户端可以尝试插入数据库,但服务器将不执行任何操作,客户端将在服务器响应时注意并删除本地创建的项目.

insert/update/remove仍然可以在服务器上运行.您需要使用在服务器上运行的Meteor.methods来创建方法以完成任何数据库写入.

当认证分支到达时,所有这些都将改变.一旦发生这种情况,您将能够提供验证器来检查和授权服务器上的数据库写入.这里有更多细节:http://news.ycombinator.com/item?id = 3825063


小智 21

[更新] 现在有一个官方和记录的Auth包,它提供了不同的解决方案来保护集合.

在CRUD级别:

[Server] collection.allow(options)和collection.deny(options).限制此集合上的默认写入方法.一旦在集合上调用了其中任何一个,就会限制该集合上的所有写入方法,而不管不安全的包.

并且还要insecure从客户端删除完全写入访问权限.

来源:Auth入门(感谢@ dan-dascalescu)


[旧答案]

显然,正在使用Auth Package(?),应该避免任何用户像现在一样完全控制db.还有人建议通过定义自己的突变(方法)来确定现有解决方案(解决方法),如果他们试图执行未经授权的操作,则会使其失败.我没有得到它要好得多,但我认为这常常是必要的,因为我怀疑AUTH包将让你实现通常的权威性逻辑上的一行水平,但可能只在CRUD方法.将不得不看看开发者有什么话要说.

[编辑]发现似乎证实了我的想法:

目前,客户端具有对集合的完全写入权限.他们可以执行任意Mongo更新命令.构建身份验证后,您将能够限制客户端对插入,更新和删除的直接访问.我们还在考虑验证器和其他类似ORM的功能.

这个答案的来源:

使用meteor访问客户端的DB,如服务器端

/sf/ask/707056941/#10101516


gre*_*reg 9

更简洁的方式:

_.each(['collection1', 'collection2'], function(collection){
    _.each(['insert','update', 'remove'], function(method){
      Meteor.default_server.method_handlers['/' + collection + '/' + method] = function(){}
    });
});
Run Code Online (Sandbox Code Playgroud)

或者使它更具惯用性:

延伸流星:

_.extend(Meteor.Collection.prototype, {
  remove_client_access: function(methods){
    var self = this;
    if(!methods) methods = ['insert','update','remove'];
    if(typeof methods === 'String') methods = [methods];
    _.each(methods, function(method){
      Meteor.default_server.method_handlers[self._prefix + method] = function(){}
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

通话更简单:

List.remove_client_access() // restrict all
List.remove_client_access('remove') //restrict one
List.remove_client_access(['remove','update']) //restrict more than one
Run Code Online (Sandbox Code Playgroud)