我正在尝试确保访问特定集合的安全,但我在执行此操作时遇到了麻烦。使用地图禁用插入、更新和删除没有问题Collection.allow()
。
问题是我还想过滤Collection.find()
andCollection.findOne()
函数返回的结果。我读到了Meteor.publish()
和Meteor.subscribe()
东西,但不知何故我无法让它工作(它没有被过滤,我只能看到所有的结果)。
在我的服务器代码中,我执行以下操作:
Groups = new Meteor.Collection("groups");
Meteor.publish("myGroups", function() {
if (Functions.isAdmin(userId)) {
return Groups.find({
sort: {
name: 1
}
});
}
});
我正在使用的功能确实有效(所以并不是它总是返回true
)。
在客户端代码中,我写了以下内容:
Meteor.subscribe("myGroups");
Groups = new Meteor.Collection("groups");
现在,当我Groups.find{});
在客户端做时,我仍然得到所有结果(而且我不应该得到任何结果)。
我误解了什么或做错了什么?我当然可以使集合完全在服务器端,并使用Meteor.methods()
和Meteor.call()
获取集合数据(这样它总是被服务器封装)。但我真的认为我不必这样做会很酷。
另外我想知道为什么这不能在与插入/更新/删除相同的级别上完成Collection.allow()
。我的意思是,我们有可能向地图添加过滤器,以便通过 find/findOne 读取数据。