我不希望我的所有用户都能插入/销毁数据。
答案 0 :(得分: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 () {};
});
}
这将禁用默认的insert / update / remove方法。客户端可以尝试插入数据库,但服务器将不执行任何操作,客户端将在服务器响应时注意并删除本地创建的项目。
插入/更新/删除仍然可以在服务器上运行。您需要使用在服务器上运行的Meteor.methods来完成任何数据库写入。
当认证分支到达时,所有这些都将改变。一旦发生这种情况,您将能够提供验证器来检查和授权服务器上的数据库写入。这里有更多细节:http://news.ycombinator.com/item?id=3825063
答案 1 :(得分:21)
[更新] 现在有一个官方的,有文档证明的Auth Package,它提供了不同的解决方案来保护集合。
在CRUD级别:
[Server] collection.allow(options)和collection.deny(options)。限制此集合上的默认写入方法。在集合上调用其中任何一个后,无论不安全的软件包如何,该集合上的所有写入方法都会受到限制。
还有insecure
来删除客户端的完全写入权限。
来源:Getting Started with Auth(感谢@ dan-dascalescu)
[OLD ANSWER]
显然正在使用Auth Package(?),应该避免任何用户像现在一样对db进行完全控制。还有人建议通过定义自己的突变(方法)来确定现有解决方案(解决方法),如果他们试图执行未经授权的操作,则会使其失败。我没有得到更好的但我认为这通常是必要的,因为我怀疑Auth Package会让你在行级实现通常的auth逻辑,但可能只在CRUD方法上实现。将不得不看看开发者必须说些什么。
[编辑] 发现似乎证实了我的想法的东西:
目前,客户端获得对该集合的完全写入权限。他们可以执行任意Mongo更新命令。构建身份验证后,您将能够限制客户端对插入,更新和删除的直接访问。我们还在考虑验证器和其他类似ORM的功能。
这个答案的来源:
Accessing to DB at client side as in server side with meteor
答案 2 :(得分:9)
更简洁的方式:
_.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
答案 3 :(得分:1)
我是Meteor的新手,但到目前为止我遇到的是这两点
您可以通过在服务器端find
命令中向publish
命令添加参数来限制客户端可以在数据库中访问的内容。然后,当客户端调用Collection.find({})
时,返回的结果将与服务器端的结果相对应,例如Collection.find({user: this.userId})
(另请参阅Publish certain information for Meteor.users and more information for Meteor.user和http://docs.meteor.com/#meteor_publish)< / p>
内置的一件事(我有流星0.5.9)是客户端只能通过id update
项,而不是使用选择器。如果尝试不符合,则会在客户端上的控制台上记录错误。 403: "Not permitted. Untrusted code may only update documents by ID."
(见Understanding "Not permitted. Untrusted code may only update documents by ID." Meteor error)。
鉴于数字2,您需要在服务器端使用Meteor.methods
来使用Meteor.call
向客户端提供远程过程调用。