摘要:通過發(fā)布訂閱模式過濾數(shù)據(jù)現(xiàn)在我們已經(jīng)把應(yīng)用中比較敏感的代碼放到了一些方法里面,我們還需要學(xué)習(xí)安全故事的另一半內(nèi)容了。當(dāng)在客戶端被調(diào)用時(shí)傳入發(fā)布器名稱,客戶端將會(huì)從發(fā)布器訂閱所有的數(shù)據(jù)。這個(gè)按鈕應(yīng)該只是給任務(wù)的所有者來顯示。
通過發(fā)布訂閱模式過濾數(shù)據(jù)
現(xiàn)在我們已經(jīng)把應(yīng)用中比較敏感的代碼放到了一些方法里面,我們還需要學(xué)習(xí)Meteor安全故事的另一半內(nèi)容了。
到現(xiàn)在為止,我們一直是假設(shè)整個(gè)整個(gè)數(shù)據(jù)庫到客戶端上,這意味著我們調(diào)用Tasks.find()方法我們將會(huì)得到集合中所有的數(shù)據(jù)。如果我們應(yīng)用程序的用戶想要保存私密敏感信息的話,這樣做并不好。我們需要一種可以控制數(shù)據(jù)的方法,使Meteor發(fā)送所需數(shù)據(jù)到客戶端數(shù)據(jù)庫
就想上一步驟的insecure一樣,所有新的Meteor應(yīng)用都在開始時(shí)帶著autopublish包的。這個(gè)包可以自動(dòng)的同步所有數(shù)據(jù)庫的數(shù)據(jù)到客戶端上,先來移除這個(gè)包,然后看看會(huì)發(fā)生什么
meteor remove autopublish
當(dāng)應(yīng)用程序刷新,任務(wù)列表將會(huì)變成空的。沒有autopublish包,我們就必須明確的指定服務(wù)端發(fā)送什么到客戶端。這個(gè)在Meteor的函數(shù)是通過Meteor.publish和Meteor.subscribe來做這些的。
現(xiàn)在來添加他們把
passwordSignupFields: "USERNAME_ONLY" }); // 添加這一行 Meteor.subscribe("tasks"); Meteor.startup(function () { // 在頁面準(zhǔn)備好之后使用Meteor.startup來渲染組件 React.render(, document.getElementById("render-target")); }); } // 添加開始 if (Meteor.isServer) { Meteor.publish("tasks", function () { return Tasks.find(); }); } // 添加結(jié)束 Meteor.methods({ addTask(text) {
一旦你添加了這些代碼,所有的任務(wù)將會(huì)再次出現(xiàn)
在服務(wù)端調(diào)用Meteor.publish注冊(cè)一個(gè)名為tasks的發(fā)布器。當(dāng)Meteor.subscribe在客戶端被調(diào)用時(shí)(傳入發(fā)布器名稱),客戶端將會(huì)從發(fā)布器訂閱所有的數(shù)據(jù)。這些數(shù)據(jù)是在數(shù)據(jù)庫中所有在這方面的任務(wù)。為了真實(shí)的感受發(fā)布訂閱模式的力量,讓我們來實(shí)現(xiàn)這樣的特性吧,他允許用戶將任務(wù)定義為私有狀態(tài),這樣其他的用戶就不能再看到這些東西了
添加一個(gè)按鈕使任務(wù)私有化來給任務(wù)添加一個(gè)“私有”屬性和一個(gè)給用戶將任務(wù)私有化的按鈕。
這個(gè)按鈕應(yīng)該只是給任務(wù)的所有者來顯示。我們想要一個(gè)標(biāo)簽來表示當(dāng)前的狀態(tài):公有或私有
首先,我們要添加一個(gè)新的方法,這個(gè)方法可以被我們調(diào)用并將任務(wù)設(shè)置為私有狀態(tài)
// simple-todos-react.jsx文件 setChecked(taskId, setChecked) { Tasks.update(taskId, { $set: { checked: setChecked} }); }, // 添加開始 setPrivate(taskId, setToPrivate) { const task = Tasks.findOne(taskId); // 確保只有任務(wù)所有者可以將任務(wù)設(shè)置為私有狀態(tài) if (task.owner !== Meteor.userId()) { throw new Meteor.Error("not-authorized"); } Tasks.update(taskId, { $set: { private: setToPrivate } }); // 添加結(jié)束 } });
現(xiàn)在我們需要傳一個(gè)新的屬性給Task,使其決定我們是否想要展示這個(gè)私有按鈕。
這個(gè)按鈕應(yīng)該只有在當(dāng)前登錄的用戶是任務(wù)的所有者時(shí)才會(huì)被展示
// App.jsx文件 renderTasks() { // 從this.data.tasks中獲取任務(wù)列表 return this.data.tasks.map((task) => { // 添加開始 const currentUserId = this.data.currentUser && this.data.currentUser._id; const showPrivateButton = task.owner === currentUserId; return; // 添加結(jié)束 }); },
// Task.jsx文件 // Task組件,表示單個(gè)的任務(wù) Task = React.createClass({ propTypes: { // 添加開始 task: React.PropTypes.object.isRequired, showPrivateButton: React.PropTypes.bool.isRequired // 添加結(jié)束 }, toggleChecked() {
添加一個(gè)按鈕,使其新的屬性去決定它是否應(yīng)該被顯示
// Task.jsx文件
checked={this.props.task.checked}
onClick={this.toggleChecked} />
// 添加開始
{ this.props.showPrivateButton ? (
) : ""}
// 添加結(jié)束
{this.props.task.username}: {this.props.task.text}
我們要為這個(gè)按鈕定義事件監(jiān)聽
// Task.jsx 文件 Meteor.call("removeTask", this.props.task._id); }, // 添加開始 togglePrivate() { Meteor.call("setPrivate", this.props.task._id, ! this.props.task.private); }, // 添加結(jié)束 render() {
最后一件事,來給Task組件的li元素更新class, 來反映私有狀態(tài)
render() { // 當(dāng)它們被關(guān)閉時(shí)給一個(gè)不同的className, // 這樣我們就可以通過CSS來設(shè)置好看的樣式了 // 添加開始 // 當(dāng)我們需要的時(shí)候可以給“確認(rèn)框”添加”私有“樣式 const taskClassName = (this.props.task.checked ? "checked" : "") + " " + (this.props.task.private ? "private" : ""); // 添加結(jié)束 return (
現(xiàn)在我們有了設(shè)置任務(wù)私有的方式,那么我們就要修改我們的發(fā)布函數(shù)使其只發(fā)送已登陸用戶的任務(wù)
// simple-todos-react.jsx 文件 } if (Meteor.isServer) { // 只發(fā)布公有的或者是屬于當(dāng)前用戶的任務(wù) Meteor.publish("tasks", function () { // 添加開始 return Tasks.find({ $or: [ { private: {$ne: true} }, { owner: this.userId } ] }); // 添加結(jié)束 }); }
要測試這個(gè)功能是否能用,我們可以使用瀏覽器的“隱私瀏覽”模式作為一個(gè)不同的用戶登錄。把兩個(gè)窗口拍兩邊,然后標(biāo)記一個(gè)私有任務(wù),看看另一個(gè)用戶是否能夠看到。現(xiàn)在把它再設(shè)置成公有狀態(tài),它就又會(huì)出現(xiàn)了!
額外的方法安全為了完成我們私有任務(wù)的特性,我們需要給deleteTask和setChecked方法一些核實(shí)的特性,用來確保只有任務(wù)的擁有者可以刪除和完成一個(gè)私有任務(wù)
// simple-todos-react.jsx removeTask(taskId) { // 添加開始 const task = Tasks.findOne(taskId); if (task.private && task.owner !== Meteor.userId()) { // 如果任務(wù)是私有狀態(tài),確保只有擁有者可以刪除 throw new Meteor.Error("not-authorized"); } // 添加結(jié)束 Tasks.remove(taskId); }, setChecked(taskId, setChecked) { // 添加開始 const task = Tasks.findOne(taskId); if (task.private && task.owner !== Meteor.userId()) { // 如果任務(wù)是私有的,確保只有任務(wù)擁有者可以完成此項(xiàng)任務(wù) throw new Meteor.Error("not-authorized"); } // 添加結(jié)束 Tasks.update(taskId, { $set: { checked: setChecked} }); },
注意:這個(gè)代碼允許任何人刪除任意公有任務(wù)。你應(yīng)該當(dāng)盡力做一些小的改變:只有任務(wù)擁有者可以刪除他們的任務(wù)
我們已經(jīng)完成了私有任務(wù)的特性了!當(dāng)攻擊者試著去看或者修改某個(gè)私有任務(wù)時(shí),我們的應(yīng)用也是安全的了!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91554.html
摘要:下一步干什么恭喜你剛剛成功編寫了你的應(yīng)用,別忘了再部署一遍,這樣你的朋友們就可以使用這些新特性了你的應(yīng)用在一個(gè)單個(gè)的任務(wù)清單中是支持合作的。檢查一下例子待辦事項(xiàng)。更多的可以控制分享多個(gè)列表的已完成應(yīng)用。 下一步干什么? 恭喜你剛剛成功編寫了你的Meteor應(yīng)用,別忘了再部署一遍,這樣你的朋友們就可以使用這些新特性了! 你的應(yīng)用在一個(gè)單個(gè)的任務(wù)清單中是支持合作的。試試怎么樣添加更多的功能...
摘要:添加,刪除,確認(rèn)完成這些操作,你將會(huì)看到你的應(yīng)用的界面響應(yīng)非常的快。。這是因?yàn)椴⒉粫?huì)在更新用戶界面之前等著服務(wù)端的響應(yīng)數(shù)據(jù)。 部署你的應(yīng)用 現(xiàn)在你有了一個(gè)可以運(yùn)行的待辦事宜的應(yīng)用,你可以分享給你的朋友們!Meteor使得發(fā)布你的應(yīng)用到其他人可以使用的互聯(lián)網(wǎng)變得非常的簡單。 同樣是在你的應(yīng)用文件夾的命令行中輸入: meteor deploy my_app_name.meteor.com ...
摘要:閑扯在翻譯之前我還是要簡要介紹一下,這是一款跨時(shí)代的框架。后來開始使用動(dòng)態(tài)的腳本語言,比如后來以此構(gòu)成了框架。最為出名的自然是。通過來傳遞數(shù)據(jù),在本地起這種事情使得開發(fā)進(jìn)入了新的階段。如果你覺得我翻譯的很爛,來給我說吧郵件地址 閑扯 在翻譯之前我還是要簡要介紹一下Meteor,這是一款跨時(shí)代的框架。真的,完全沒有騙你。 一開始的網(wǎng)站是純靜態(tài)頁面搭建的。 后來開始使用動(dòng)態(tài)的腳本語言,比如...
摘要:為了開啟這套賬戶系統(tǒng)和界面,我們需要去添加相關(guān)的包。使用,而不是在文件加入開始這段代碼只會(huì)在客戶端執(zhí)行加入結(jié)束添加用戶關(guān)聯(lián)功能現(xiàn)在你已經(jīng)可以創(chuàng)建賬戶并登錄你的應(yīng)用程序了。例如包含了已登陸用戶的用戶名。 添加多用戶賬戶 Meteor帶來了一套賬戶系統(tǒng)然后順便還帶了用戶界面來讓你可以在幾分鐘之內(nèi)在你的應(yīng)用中添加多用戶功能 目前,這套UI組件使用Blaze作為默認(rèn)的UI引擎,在未來,可能會(huì)以...
摘要:數(shù)據(jù)存儲(chǔ)集合是存儲(chǔ)持久化數(shù)據(jù)的方式。中的集合比較特殊的是,它可以從服務(wù)端,包括客戶端接收數(shù)據(jù)。它也可以自動(dòng)的自我更新,因此一個(gè)視圖組件受到一個(gè)集合的支持,他可以自動(dòng)的展示最新的數(shù)據(jù)。 數(shù)據(jù)存儲(chǔ) 集合(Collection)是Meteor存儲(chǔ)持久化數(shù)據(jù)的方式。Meteor 中的集合比較特殊的是,它可以從服務(wù)端,包括客戶端接收數(shù)據(jù)。這使得編寫視圖邏輯變得更加簡單 -- 不用去寫太多的服務(wù)端...
閱讀 750·2021-07-25 21:37
閱讀 3663·2019-08-30 15:55
閱讀 2579·2019-08-30 15:54
閱讀 1728·2019-08-30 15:44
閱讀 3129·2019-08-30 15:44
閱讀 866·2019-08-30 15:43
閱讀 1035·2019-08-29 15:36
閱讀 3046·2019-08-29 10:58