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