我正在尝试使用简单的聊天应用和Meteor 0.8.0
对于消息列表,每条消息通过user_id
引用用户,我想显示用户名和消息。
是否可以限制find() - 调用的选择模式,以便例如允许Meteor.users.find({_id: msg.userId})
但不允许Meteor.users.find({})
?
不幸的是,Collection.allow / .deny没有涵盖这一点,我认为这是自然的地方。如果可以,我可以简单地使用Meteor.publish("usersWithName",function() {Meteor.users.find({},{fields:{username:1}});
,而不必担心攻击者可以在客户端上获取完整的用户列表。
目前,我使用smart-publish
包仅发布消息引用的用户,但我更倾向于使用更简单的解决方案。
答案 0 :(得分:1)
不,由于永远不会联系服务器,因此无法限制查找查询在客户端运行。它只是针对它的本地集合运行查询。与插入,更新或删除首先发生在客户端然后验证服务器的方式相同(即有人可以删除其客户端上的文档,但服务器将拒绝它)。
处理此问题的最佳方法是仅发布您特别需要的文档。正如您所提到的,如果您只发布客户端应具有的文档,那么您就是安全的。即使有一种方法可以强制限制搜索客户端,但传递更多的集合仍然没有意义。