【问题标题】:Cannot set correct edit permissions in Meteor.methods无法在 Meteor.methods 中设置正确的编辑权限
【发布时间】:2016-11-09 05:05:43
【问题描述】:

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

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

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

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

我只发布与编辑相关的代码,因为我假设编辑和删除几乎相同。我对 Meteor 非常陌生,因此我们非常感谢您的任何帮助!

更新!我正在尝试将我的 createdBy 切换到我推荐的 @Yann 方法,但它不允许放置用户 ID,并且只返回错误 createdBy is required 。我正在尝试的代码是

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 }` );
    }
  }
}
});

【问题讨论】:

    标签: javascript meteor fullcalendar meteor-blaze meteor-accounts


    【解决方案1】:

    您的代码中有几个错误:

    首先,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() )
    

    请注意,允许/拒绝规则适用于服务器方法。

    【讨论】:

    • 感谢有关插入该用户 ID 的建议!一个问题我将更新方法更改为使用if( event.createdBy === currentUserId ),但似乎无法获取当前用户的ID。知道可能出了什么问题吗?谢谢!
    • 刚刚尝试过if( event.createdBy === Meteor.userId() ),但 if 语句上的 console.log 仍然没有任何返回值。会不会有什么东西阻止它获取 userId?
    • 如果用户没有登录,那么 Meteor.userId() 将返回 undefined。
    • 你在使用进口吗?如果是这样,您将需要导入 Meteor 对象。
    • 用户已登录,我没有使用导入。我刚刚通过删除if( event.createdBy === Meteor.userId() ) 进行了测试,并且我在控制台记录了 Meteor.userId (),这返回了应有的 userId。但我注意到了一些有趣的事情。似乎每次我尝试删除或更新事件时,它都在积极尝试将用户 ID 更改为当前用户,当我尝试删除项目时,它也会尝试调用插入方法和更新方法。我相信这可能是问题所在。这是否位于add-edit-event-modal.jscode 中的某个地方。我知道代码有些联系在一起。
    【解决方案2】:

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

    注册

    【讨论】:

    • 会有问题吗?不是不能进行编辑,我的问题是当我设置权限时,它仍然允许任何登录用户进行编辑。到目前为止,它唯一阻止的是注销的用户
    • 我是不是使用了错误的代码来设置这些权限?
    • 将 if 语句更改为 event.createdBy === Meteor.userId()
    • 将 if 语句更改为 if(event.createdBy === currentUserId) 仍然不会阻止其他用户进行编辑。
    • 并尝试if(event.createdBy === Meteor.userId())仍然没有成功
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多