0

我试图设置通过我的Meteor方法添加,编辑和删除的权限。 我正在制作用户可以添加事件的日历,并且所有人都可以看到事件,但事件只能由事件所有者更新或删除。无法在Meteor.methods中设置正确的编辑权限

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

我已阅读文档,但仍无法使其工作。在我的方法我已经设置与var currentUserId = Meteor.userId();一个变种,我一直试图限制编辑和删除通过法if({createdBy: currentUserId}) {allow edit and delete here}

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

我只发布与编辑相关的代码,因为我假设编辑和删除将几乎完全相同。我对流星非常陌生,所以任何和所有的帮助表示赞赏!

更新!我试图将我的createdBy转换为我的方法,如@Yann推荐的方法,但不允许放置用户标识,只需返回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 }`); 
    } 
    } 
}); 

END

的附加编辑模式代码

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

update方法

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

回答

0

有在你的代码的几个误区:

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

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

+0

感谢您的插入该用户ID的建议!有一个问题,我改变我的更新方法使用'if(event.createdBy === currentUserId)',但它好像无法获得当前用户的ID。任何想法可能会出错?谢谢! –

+0

应该只是'Meteor.userId()'如上所示。 –

+0

刚刚尝试过'if(event.createdBy === Meteor.userId())',并且if语句中仍然没有任何console.log也不会返回任何内容。有没有办法阻止它获得userId? –

0

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

的REG

+0

这是否是一个问题?这不是无法编辑,我的问题是,当我设置权限时,它仍允许任何登录用户进行编辑。目前阻止的唯一事情是注销用户 –

+0

我可以只使用错误的代码来设置这些权限吗? –

+0

将if语句更改为event.createdBy === Meteor.userId() – Yann