如何在Meteor中使动态订阅安全?

时间:2013-04-29 08:28:25

标签: meteor

这个问题建立在前一个问题的基础上(见here)。

使用此代码设置动态订阅(稍微修改了上一个问题):

Meteor.startup(function(){
  Meteor.subscribe('parents');

  Deps.autorun(function() {
    parent = Parents.findOne({ _id: Session.get('parentId') });
    if (!parent) return;
    Meteor.subscribe('kids', parent);
  });
});

问题是服务器端必须信任客户端传递的parent对象。理想情况下,人们只想传递父对象的_id,如下所示:

  Deps.autorun(function() {
    parentId = Session.get('parentId');
    if (!parentId) return;
    Meteor.subscribe('kids', parentId);
  });

但是,在这种情况下,动态订阅行为会中断(例如,更新父项的子数组时,客户端上的kids集合不会更新。)

为什么Session.get('parentId')的反应性低于Parents.findOne({ _id: Session.get('parentId') }),或者与Meteor.subscribe('kids', parent)Meteor.subscribe('kids', parentId)有关?

编码此权利的最佳模式是什么?

1 个答案:

答案 0 :(得分:0)

您想要做的事情似乎如下:

Deps.autorun(function() {
    parent = Parents.findOne({ _id: Session.get('parentId') }, {fields: {_id: 1}});
    if (!parent) return;
    Meteor.subscribe('kids', parent._id);
});

然而,这仍然不完全安全;它只是检查Parents集合以确保在尝试订阅它之前存在引用的Session变量 - 这取决于parents订阅。如果您希望它得到妥善保护,您将不希望任何父母通过parent订阅客户端,如果客户端无法看到它们。