我正在浏览显微镜书(再次),我试图找出Allow和Deny回调从哪里获取参数。
收藏夹文件夹中的posts.js:
Posts = new Meteor.Collection('posts');
Posts.allow({
update: ownsDocument,
remove: ownsDocument
});
Posts.deny({
update: function(userId, post, fieldNames){
return (_.without(fieldNames, 'url', 'title').length > 0);
}
});
lib文件夹中的permissions.js
ownsDocument = function(userId, doc){
return doc && doc.userId === userId;
}
假设用户调用
Posts.update("postID234232", {objectTo: insert}, function(){//callback} );
然后运行 Posts.allow
和Posts.deny
。
ownsDocument
函数从哪里获取userId
和doc
参数的内容?
update
中的Posts.deny
键从哪里获取userId
,post
和fieldNames
的内容?
答案 0 :(得分:3)
1)ownsDocument函数在哪里获取userId的内容 来自?
的doc参数
userId
在客户端和服务器上通过Meteor.userId()
在meteor中全局可用,因此当前连接的用户希望对ownsDocument
执行CRUD操作采集。为方便起见,传递了此参数,因为在allow/deny
回调中,可以使用Meteor.userId()
来访问当前用户。
doc参数是受插入/更新/删除影响的文档,您必须记住,在集合CRUD操作中执行允许/拒绝回调规则,以便我们可以访问客户端正在尝试的实际文档修改。
2)Posts.deny中的更新密钥在哪里获取内容 来自?
的userId,post和fieldNames
当客户端调用Collection.update时,会传递一个名为mongo修饰符对象的对象,该对象允许您指定要修改的集合中的哪些字段。
fieldNames
参数包含客户端愿意修改的顶级字段名称,以此更新调用为例:
Posts.update(postId,{
$set:{
title:"New title !"
}
});
更新方法会将"title"
提取为客户端想要修改的顶级字段,并将其传递给允许/拒绝规则。
以下是Meteor.Collection的更新方法可以用来计算传递给允许/拒绝规则的参数的伪代码,这不是实际的流星代码,仅作为解释提供。
Meteor.Collection.prototype.update = function(selector, modifier, ...){
// get a cursor of documents that should be impacted by the update
var impactedDocuments = this.find(selector);
// extract top-level fields names from the modifer [1]
var fieldNames = _.keys(modifier.$set);
// iterate over impacted documents
impactedDocuments.forEach(function(impactedDocument){
// iterate over "validators" (Meteor internal name for allow/deny rules)
_.each(this._validators.update.allow, function(updateAllowRule){
// call the allow rule with computed parameters
updateAllowRule(Meteor.userId(), impactedDocument, fieldNames);
});
});
}
通过
定义允许规则时Collection.allow({
update:function(userId, doc, fieldNames, modifier){
// ...
}
});
Meteor将此功能附加到Collection._validators.allow.update
答案 1 :(得分:1)
好的,所以经过一些阅读后,看来Meteor会自动将userId
和doc
参数传递给分配给传递给update
和remove
键的任何函数对象允许或否认。
所以,一个非常重要的外卖(我认为):
'用户id'和' doc'必须按照这个特定的顺序。我可以将ownsDocument
重写为以下内容:
ownsDocument = function(theCurrentUsersId, document){
return document && document.theCurrentUsersId === theCurrentUsersId;
}
但用户的ID必须在文档之前。
我无法做到:
ownsDocument = function(document, theCurrentUsersId){
return document && document.theCurrentUsersId === theCurrentUsersId;
}