国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

翻譯 Meteor React 制作 Todos - 11 - 發(fā)布訂閱

用戶83 / 2973人閱讀

摘要:通過發(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.publishMeteor.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 (
    
  • 基于私有狀態(tài)有選擇地推送數(shù)據(jù)

    現(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ù)的特性,我們需要給deleteTasksetChecked方法一些核實(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

    相關(guān)文章

    • 翻譯 Meteor React 制作 Todos - 12 - 下一步

      摘要:下一步干什么恭喜你剛剛成功編寫了你的應(yīng)用,別忘了再部署一遍,這樣你的朋友們就可以使用這些新特性了你的應(yīng)用在一個(gè)單個(gè)的任務(wù)清單中是支持合作的。檢查一下例子待辦事項(xiàng)。更多的可以控制分享多個(gè)列表的已完成應(yīng)用。 下一步干什么? 恭喜你剛剛成功編寫了你的Meteor應(yīng)用,別忘了再部署一遍,這樣你的朋友們就可以使用這些新特性了! 你的應(yīng)用在一個(gè)單個(gè)的任務(wù)清單中是支持合作的。試試怎么樣添加更多的功能...

      anRui 評(píng)論0 收藏0
    • 翻譯 Meteor React 制作 Todos - 06 - 部署應(yīng)用

      摘要:添加,刪除,確認(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 ...

      xiaochao 評(píng)論0 收藏0
    • 翻譯 Meteor React 制作 Todos - 01 - 創(chuàng)建應(yīng)用

      摘要:閑扯在翻譯之前我還是要簡要介紹一下,這是一款跨時(shí)代的框架。后來開始使用動(dòng)態(tài)的腳本語言,比如后來以此構(gòu)成了框架。最為出名的自然是。通過來傳遞數(shù)據(jù),在本地起這種事情使得開發(fā)進(jìn)入了新的階段。如果你覺得我翻譯的很爛,來給我說吧郵件地址 閑扯 在翻譯之前我還是要簡要介紹一下Meteor,這是一款跨時(shí)代的框架。真的,完全沒有騙你。 一開始的網(wǎng)站是純靜態(tài)頁面搭建的。 后來開始使用動(dòng)態(tài)的腳本語言,比如...

      VishKozus 評(píng)論0 收藏0
    • 翻譯 Meteor React 制作 Todos - 09 - 添加用戶賬戶

      摘要:為了開啟這套賬戶系統(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ì)以...

      levius 評(píng)論0 收藏0
    • 翻譯 Meteor React 制作 Todos - 03 - 集合

      摘要:數(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ù)端...

      Scott 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <