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