2012-04-11 115 views

回答

21

[更新]现在有一个官方和文件化的Auth软件包,它提供了不同的解决方案来确保收集。

在一个CRUD水平:

[服务器] collection.allow(选项)和collection.deny(选项)。限制此集合的默认写入方法。一旦在集合上调用其中的任何一种,则无论何种不安全包,该集合上的所有写入方法都会受到限制。

而且还有insecure从客户端删除完整写访问。

来源:Getting Started with Auth(感谢@丹dascalescu)


[老答案】

显然有对AUTH包工作应该避免任何用户承担完全控制(?)分贝,因为它是现在。还有人建议通过定义自己的突变(方法)来解决现有的解决方案(解决方法),并在尝试执行未经授权的操作时使其失败。我没有得到更好的结果,但我认为这通常是必要的,因为我怀疑Auth Package会让你在行级别实现通常的认证逻辑,但可能只是在CRUD方法上。将不得不看看开发者不得不说的。

[编辑] 找到东西,这似乎证实了我的想法:

目前该客户端是考虑到收集完全写入访问。他们可以执行任意的Mongo更新命令。一旦我们构建身份验证,您将能够限制客户端直接访问插入,更新和删除。我们也在考虑验证器和其他类似ORM的功能。

来源这个答案:

Accessing to DB at client side as in server side with meteor

https://stackoverflow.com/questions/10100813/data-validation-and-security-in-meteor/10101516#10101516

+0

感谢您的想法和链接! – TK421 2012-04-12 14:29:37

+0

也可以在Quora上找到这个线索,其中一位Meteor开发人员给出了答案:http://www.quora.com/Meteor-web-framework/Whats-cool-about-Meteor/answer/Rory-I-Sinclair/comment/878076 – dentarg 2012-06-17 18:24:14

+1

@nrako:你可否更新答案以提及https://github.com/meteor/meteor/wiki/Getting-Started-with-Auth? – 2012-10-10 07:59:23

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() {}; 
    }); 
} 

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

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

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

+0

非常感谢所有的信息!不能等待看到这个成熟。 – TK421 2012-04-12 14:29:22

+0

是否有可能确保从客户端读取集合? – HansPinckaers 2012-05-03 12:29:59

+1

没关系;只是删除自动发布。 '流星移除自动发布' – HansPinckaers 2012-05-08 18:51:28

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 
+0

只是想提一下,这是不再需要的,因为v0.5.0引入了认证。请参阅http://docs.meteor.com/#accounts_api。 @greg:任何你可以更新你的答案的机会? – 2012-11-08 06:49:59

1

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

  1. 您可以限制哪些客户端可以在数据库中通过在服务器端publish添加参数到find命令访问命令。然后,当客户端调用Collection.find({}),返回的结果对应于在服务器端会是什么,例如,Collection.find({user: this.userId})(见Publish certain information for Meteor.users and more information for Meteor.userhttp://docs.meteor.com/#meteor_publish)中内置

  2. 一件事(我有流星0.5。 9)是,客户端只能通过编号为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客户端。