Meteor允许更新:我试图让任何用户加入"一个帖子,但只有帖子创建者可以编辑帖子?

时间:2014-01-07 00:17:39

标签: permissions meteor

所以我正在尝试构建一个类似于主要Meteor页面上的Parties示例的应用程序。在缔约方应用程序中,您可以创建一个聚会并邀请其参与或公开。我想做的是改变它,即使它是一个公共聚会,你仍然需要通过点击按钮加入它。

我有这个工作,除了通过console.logs我已经发现它是不允许的,因为点击Join按钮的用户正在尝试更新Event但当前只有事件开始有权访问更新。

所以这是正确的

var currentUser = Meteor.userId();
    var currentEventId = this._id;

    Events.update(currentEventId, {$addToSet: { attendees: currentUser }}, function(error) {
        console.log(error);
        if (error) {
            throwError(error.reason);
        } else {
            Router.go('eventPage', {_id: currentEventId});
        }

但现在我需要改变它似乎

Events.allow({
update: ownsDocument,
remove: ownsDocument});

ownsDocument = function(userId, doc) {
    return doc && doc.userId === userId;
}

所以我认为我需要更改更新,例如:

如果您不是用户,则需要加入或登录。如果您是用户但不是活动创建者,则可以将userId添加到与会者数组。如果您是活动创建者,则可以编辑活动。我只是不知道是否允许在允许更新功能或如何写它真的,因为我仍然是JS的新手。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

首先,请确保从insecure删除.meteor/packages包。

我建议只实施基本 allow / deny规则。例如,所有者可以更新某些字段。

对于任何稍微复杂的事情,请使用Meteor.methods。方法将忽略允许&拒绝规则,让你执行更复杂的行动。

方法总是在服务器端执行/确认,并且可以选择在客户端上进行“模拟”,以使其看起来好像是立即执行的!

例如,将当前登录用户添加到事件 -

的方法
Meteor.methods({
  'attendEvent': function(eventId){
    // check they're logged in
    check(this.userId, String);
    // check the eventId isn't something un-expected
    check(eventId, String);
    // add the user to `attendees`, using `$addToSet` as each user can only attend once
    Events.update({_id: eventId}, {$addToSet: { attendees: this.userId}});
  }
});

然后,您可以在客户端上调用操作,如:

Template.myTemplate.events({
   'click a[data-action="attendEvent"][data-event]': function(e){
      // get the eventId from element data- however data could be available in this.eventId / this._id too!
      var eventId = $(e.currentTarget).data('event')
      Meteor.call('attendEvent', eventId)
    }
});

答案 1 :(得分:0)

您可以修改allow()功能以匹配您想要的逻辑。将您的update:更改为:

update: function( userId, doc, fields, modifier ){
   return ( doc &&  doc.userId === userId ) || ( userId && modifier === {$addToSet: { attendees: userId}} );
},

你可能还想在调用`Events.update()之前在客户端上添加if来检查currentUser,因为它会失败。