我试图在Meteor的文档级别创建一个访问控制系统,我似乎不知道如何阻止用户获取文档。
我已阅读collection.allow
和collection.deny
周围的文档。通过这些对象我们可以控制"谁"可以update
,remove
和insert
。问题是Meteor似乎没有为fetch
操作提供类似的功能。 拒绝未经授权的用户阅读文档的正确方法是什么?
额外要求:这需要在服务器端进行,因此我们不会通过网络向未经授权的用户泄露文档。
答案 0 :(得分:1)
1)从您的应用中删除autopublish
个包。
2)创建您自己的发布并拒绝未经授权的用户访问
Meteor.publish("userData", function () {
if (this.userId) { // Check user authorized
return MyCollection.find(); // Share data
} else {
this.ready(); // Share nothing
}
});
答案 1 :(得分:1)
一旦到达客户端,就无法拒绝对集合数据的读取。理论上,由于用户可以修改代码,因此无法在客户端上实际执行任何。但是,您可以强制执行哪些文档发布。
发布功能可以处理arbirtary复杂性的授权规则。这是一个简单的示例,我们希望将Messages
集合中的文档仅发布给属于给定组成员的用户:
Meteor.publish('messagesForGroup', function(groupId) {
check(groupId, String);
var group = Groups.findOne(groupId);
// make sure we have a valid group
if (!group)
throw new Meteor.Error(404, 'Group not found');
// make sure the user is a member
if (!_.contains(group.members, this.userId))
throw new Meteor.Error(403, 'You are not a member of the group');
return Messages.find({groupId: groupId});
});