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