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