摘要:發布與訂閱在端使用函數注冊一個的發布者,需要在客戶端對進行訂閱,使用訂閱了現在已經添加的數據就會重新出現在頁面上。利用發布訂閱模式,我們也可以實現對于私有數據的訪問。
我們可以使用安全的方法讓用戶端不直接操作數據庫,但是還是可以直接讀取數據庫內容,如果我們還需要保護私有的數據存儲,在客戶端直接使用Collection.find(),這樣的操作方式在實際的項目中并不會使用,這樣的數據無法保證私有性和安全性。如果一些數據我們并不想自動的在客戶端更新,就需要自定義publish和subscribe,如何在Meteor中自定義發布與訂閱模式呢?
Remove Autopublish在 Meteor:方法控制中我們移除了 insecure,在這里我們需要移除autopublish。顧名思義,autopublish的意思就是meteor自動的實現數據的publish/subscribe。
meteor remove autopublish
移除之后在我們添加數據以后,頁面就不再直接顯示數據了。想要顯示數據,我們需要使用Meteor.publish和Meteor.subscribe方法,讓服務端通知客戶端的數據更新。
發布與訂閱 publishif (Meteor.isServer) { Meteor.publish("languages", function () { return Languages.find(); }); }subsribe
if (Meteor.isClient) { Meteor.subscribe("languages"); Template.meteor_collection.helpers({ languages: Languages.find({}, {sort: {createdAt: -1}}) }); });
在Server端使用Meteor.publish函數注冊一個"languages"的發布者,需要在客戶端對"languages"進行訂閱,使用Meteor.subscribe訂閱了"languages",現在已經添加的數據就會重新出現在頁面上。
利用發布/訂閱模式,我們也可以實現對于私有數據的訪問。
在頁面上添加一個private的按鈕:
{{#each others}}{{/each}} {{name}} ,{{updateAt}}
{{#unless private}} {{/unless}}
添加設置為privte的方法:
Meteor.methods({ addLanguage: function (text) { Languages.insert({ name: text, createdAt: new Date() }); }, updateLanguage: function (_id) { Languages.update(_id, { $set: {updateAt: new Date()} }) }, removeLanguage: function (_id) { Languages.remove(_id); }, setPrivate: function (_id) { Languages.update(_id, { $set: {private: true} }) } });
客戶端調用設置privte的方法:
Template.other_event.events({ "click .delete": function () { Meteor.call("removeLanguage", this._id); }, "click .update": function () { Meteor.call("updateLanguage", this._id); }, "click .private": function () { Meteor.call("setPrivate",this._id); } });設置發布的數據必須是私有的
在Meteor.publish的可以使用filter過濾掉不是改用戶的,非私有的數據:
Meteor.publish("languages", function () { return Languages.find({ $or: [ {private: true} //auth user //,{owner:this.userId()} ] }); });
測試這樣的數據可以使用不通的用戶在不通的瀏覽器上面做測試,每個用戶都是只能看到自己的數據。
對刪除數據的操作做檢查只允許用戶對于自己的數據進行刪除操作
removeLanguage: function (_id) { var language=Languages.findOne(_id); if(language.private&&language.owner !=Meteor.userId){ throw new Meteor.Error("not-authorized"); } Languages.remove(_id); }
這樣我們就能保證私有數據的安全,客戶端不能直接操作數據(remove insecure),客戶端也不直接訪問數據庫(remove autopublish),就有效的保護私有數據的安全。
項目地址 :https://github.com/jjz/meteor/tree/master/meteor-publish
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18827.html
摘要:發布與訂閱在端使用函數注冊一個的發布者,需要在客戶端對進行訂閱,使用訂閱了現在已經添加的數據就會重新出現在頁面上。利用發布訂閱模式,我們也可以實現對于私有數據的訪問。 我們可以使用安全的方法讓用戶端不直接操作數據庫,但是還是可以直接讀取數據庫內容,如果我們還需要保護私有的數據存儲,在客戶端直接使用Collection.find(),這樣的操作方式在實際的項目中并不會使用,這樣的數據無法...
摘要:通過發布訂閱模式過濾數據現在我們已經把應用中比較敏感的代碼放到了一些方法里面,我們還需要學習安全故事的另一半內容了。當在客戶端被調用時傳入發布器名稱,客戶端將會從發布器訂閱所有的數據。這個按鈕應該只是給任務的所有者來顯示。 通過發布訂閱模式過濾數據 現在我們已經把應用中比較敏感的代碼放到了一些方法里面,我們還需要學習Meteor安全故事的另一半內容了。到現在為止,我們一直是假設整個整個...
摘要:下一步干什么恭喜你剛剛成功編寫了你的應用,別忘了再部署一遍,這樣你的朋友們就可以使用這些新特性了你的應用在一個單個的任務清單中是支持合作的。檢查一下例子待辦事項。更多的可以控制分享多個列表的已完成應用。 下一步干什么? 恭喜你剛剛成功編寫了你的Meteor應用,別忘了再部署一遍,這樣你的朋友們就可以使用這些新特性了! 你的應用在一個單個的任務清單中是支持合作的。試試怎么樣添加更多的功能...
閱讀 3077·2021-09-22 15:20
閱讀 2600·2019-08-30 15:54
閱讀 1966·2019-08-30 14:06
閱讀 3114·2019-08-30 13:05
閱讀 2457·2019-08-29 18:36
閱讀 568·2019-08-29 15:10
閱讀 523·2019-08-29 11:17
閱讀 818·2019-08-28 18:11