无法在 Meteor.methods 中设置正确的编辑权限

Cannot set correct edit permissions in Meteor.methods

我正在尝试通过我的 Meteor 方法设置添加、编辑和删除权限。 我正在开发一个日历,用户可以向其中添加事件并且所有人都可以看到事件,但是事件只能由事件所有者更新或删除。

到目前为止,我已经将其设置为只有登录用户才能插入项目的位置,并且在插入时会分配 createdBy:currentUserId 值,但在插入项目后,我希望将其设置为只有创建事件的用户可以更新或删除它。这应该来自创建项目时存储的 createdBy

我已经通读了文档,但仍然无法正常工作。在我的方法中,我一直在使用 var currentUserId = Meteor.userId(); 设置一个 var,并且我一直在尝试通过 if({createdBy: currentUserId}) {allow edit and delete here}

的方法来限制编辑和删除

到目前为止我所做的一切都不能阻止其他用户删除或编辑其他用户的事件。

我只发布与编辑相关的代码,因为我假设编辑和删除几乎相同。我是 Meteor 的新手,非常感谢您的帮助!

更新!我正在尝试像@Yann 推荐的那样将我的 createdBy 切换到我的方法中,但它不允许放置用户 ID,只需要 returns 一个 createdBy 错误。我正在尝试的代码是

Meteor.methods({
  addEvent( event ) {
    var currentUserId = Meteor.userId();
    var createdBy = currentUserId;
    check( event, {

      title: String,
      start: String,
      end: String,
      type: String,
      guests: Number
    });

    try {
      return Events.insert( event, {
        $set: createdBy
      });
    } catch ( exception ) {
      throw new Meteor.Error( '500', `${ exception }` );
    }
  }
});

更新结束

添加编辑模态代码

Template.addEditEventModal.events({
  'submit form' ( event, template ) {
    event.preventDefault();
    var currentUserId = Meteor.userId();


    let eventModal = Session.get( 'eventModal' ),
        submitType = eventModal.type === 'edit' ? 'editEvent' : 'addEvent',
        eventItem  = {
           createdBy: currentUserId,
          title: template.find( '[name="title"]' ).value,
          start: template.find( '[name="start"]' ).value,
          end: template.find( '[name="end"]' ).value,
          type: template.find( '[name="type"] option:selected' ).value,
          guests: parseInt( template.find( '[name="guests"]' ).value, 10 )
        };

    if ( submitType === 'editEvent' ) {
      eventItem._id   = eventModal.event;
    }

    Meteor.call( submitType, eventItem, ( error ) => {
      if ( error ) {
        Bert.alert( error.reason, 'danger' );
      } else {
        Bert.alert( `Event ${ eventModal.type }ed!`, 'success' );
        closeModal();
      }
    });
  },
   'click .delete-event' ( event, template ) {
    let eventModal = Session.get( 'eventModal' );
    if ( confirm( 'Are you sure? This is permanent.' ) ) {
      Meteor.call( 'removeEvent', eventModal.event, ( error ) => {
        if ( error ) {
          Bert.alert( error.reason, 'danger' );
        } else {
          Bert.alert( 'Event deleted!', 'success' );
          closeModal();
        }
      });
    }
  }
});

更新方法

Meteor.methods({

  editEvent( event ) {

    check( event, {
      _id: String,
      createdBy: String,
      title: Match.Optional( String ),
      start: String,
      end: String,
      type: Match.Optional( String ),
      guests: Match.Optional( Number )
    });
    var currentUserId = Meteor.userId();
  if({createdBy: currentUserId}){
    try {
      return Events.update( event._id, {
        $set: event
      });
    } catch ( exception ) {
      throw new Meteor.Error( '500', `${ exception }` );
    }
  }
}
});

检查允许机制以设置插入、更新和删除的允许规则。 https://docs.meteor.com/api/collections.html#Mongo-Collection-allow

注册

您的代码中有几个错误:

首先,Events.insert( event, {$set: createdBy })没有意义。您正在尝试在插入的同时执行 $set 而您的 createdBy 只是一个字符串。

尝试:

Meteor.methods({
  addEvent( event ) {
    check( event, {    
      title: String,
      start: String,
      end: String,
      type: String,
      guests: Number
    });

    try {
      event.createdBy = Meteor.userId();
      return Events.insert(event);
    } catch ( exception ) {
      throw new Meteor.Error( '500', `${ exception }` );
    }
  }
});

稍后在您更新的方法中您有 if({createdBy: currentUserId}) 这也没有任何意义,因为它总是评估为真(您基本上是在写 if(object)。改为使用:

if( event.createdBy === Meteor.userId() )

请注意 allow/deny 规则 适用于服务器方法。