Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 如何保护客户端MongoDB API?_Meteor - Fatal编程技术网

Meteor 如何保护客户端MongoDB API?

Meteor 如何保护客户端MongoDB API?,meteor,Meteor,我不希望我的所有用户都能插入/销毁数据。[UPDATE]现在有一个官方的、有文档记录的身份验证包,它提供了不同的解决方案来保护收集 在积垢水平上: [Server]collection.allow(选项)和collection.deny(选项)。限制此集合上的默认写入方法。一旦对集合调用了这两种方法中的任何一种,则该集合上的所有写入方法都将受到限制,而与不安全的包无关 而且还有不安全的来删除客户端的完全写访问权限 资料来源:(感谢@dan dascalescu) [旧答案] 很明显,有人正在开

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

[UPDATE]现在有一个官方的、有文档记录的身份验证包,它提供了不同的解决方案来保护收集

在积垢水平上:

[Server]collection.allow(选项)和collection.deny(选项)。限制此集合上的默认写入方法。一旦对集合调用了这两种方法中的任何一种,则该集合上的所有写入方法都将受到限制,而与不安全的包无关

而且还有
不安全的
来删除客户端的完全写访问权限

资料来源:(感谢@dan dascalescu)


[旧答案]

很明显,有人正在开发Auth包(?),这样可以避免任何用户像现在这样完全控制数据库。还有人建议,通过定义您自己的突变(方法),并在尝试执行未经授权的操作时使其失败,存在一个现有的解决方案(变通方法)。我没有得到更好的结果,但我认为这通常是必要的,因为我怀疑Auth包是否可以让您在行级别实现通常的Auth逻辑,但可能仅在CRUD方法上实现。将不得不看看开发人员要说些什么

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

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

这一答案的来源:


虽然还没有文档化的方法来实现这一点,但这里有一些代码可以满足您的需要:

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 () {};
   });
}
这将禁用默认的插入/更新/删除方法。客户端可以尝试插入到数据库中,但服务器不会执行任何操作,当服务器响应时,客户端将注意到并删除本地创建的项

插入/更新/删除仍将在服务器上工作。您需要使用Meteor.methods创建在服务器上运行的方法来完成任何数据库写入

当身份验证分支到达时,所有这些都将改变。一旦发生这种情况,您将能够提供验证器来检查和授权服务器上的数据库写入。这里有更详细的说明:

更简洁的方式:

_.each(['collection1', 'collection2'], function(collection){
    _.each(['insert','update', 'remove'], function(method){
      Meteor.default_server.method_handlers['/' + collection + '/' + method] = function(){}
    });
});
或者让它更地道:

扩展流星:

_.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(){}
    });
  }
});
电话更简单:

List.remove_client_access() // restrict all
List.remove_client_access('remove') //restrict one
List.remove_client_access(['remove','update']) //restrict more than one

我是流星的新手,但到目前为止我遇到的是这两点

  • 通过向服务器端
    publish
    命令中的
    find
    命令添加参数,可以限制客户端在数据库中可以访问的内容。然后,当客户端调用
    Collection.find({})
    时,返回的结果与服务器端的结果相对应,例如,
    Collection.find({user:this.userId})
    (另请参见和)

  • 内置的一件事(我有meteor 0.5.9)是,客户端只能
    按id更新
    项,而不能使用选择器。如果有不符合要求的尝试,则会将错误记录到客户端的控制台<代码>403:“不允许。不受信任的代码只能按ID更新文档。”
    (请参阅)


  • 考虑到第2个问题,您需要在服务器端使用
    Meteor.methods
    ,通过
    Meteor.call
    向客户端提供远程过程调用

    很好,谢谢你提供的所有信息!迫不及待地想看到这一成熟。是否也可以防止从客户端读取集合;只需删除自动发布
    meteor remove autopublish
    meteor 0.5.0及以上版本中不需要此技术。使用
    允许
    拒绝
    。感谢您的想法和链接!另外,请在Quora上使用Meteor开发者之一的答案浏览此线程:@nrako:您是否可以更新答案以提及?只是想提及,这不再是必要的,因为v0.5.0引入了身份验证。看@格雷格:你有没有可能更新你的答案?