簡體   English   中英

使用Firebase規則構建數據

[英]Structuring Data with Firebase Rules

我創建了一個APP,用戶可以在其中發布Tasks 注冊用戶可以看到其他用戶的任務,但不允許用戶對其進行編輯,除非用戶是該任務的發布者。

直到現在我還沒有設置Firebase規則,因此所有內容都可以刪除或讀取。 我將盡我所能嘗試盡最大可能的方式來解釋我要完成的工作。

如果我專注於該節點中的主要Task道具,則它包含3個基本道具:

  • 狀態
  • posterID
  • workerID

狀態不應由任務發布者或其他任何人編輯,而應由服務器功能處理。 應該通過發布新任務來設置posterID,並且對任何人都不能對其進行編輯。 至於閱讀規則,注冊用戶可以閱讀任務的所有道具。

我想避免使用將任務作為數據接受並通過對數據庫的管理員權限進行設置的服務器功能,因為用戶將無法以這種方式體驗脫機持久性。

我想出了這個“不是很有效”的解決方案。 我一直在測試是否可以編輯用戶ID未能發布的任務的狀態,因為它會更改狀態,因此我陷入了困境。 它應該無法做到的地方。

安全規則:

   "Tasks" : {
      ".read": "auth != null",
      ".write": "auth != null", //Users can post tasks
        "$taskID":{
          // Only the owner of the task can edit its props
          ".write": "root.child('Tasks').child('$taskID').child('posterID').val() === auth.uid",
            // But the status is for nobody editable
            "status": {
                ".write": false
            }
        }
   }

碼:

  updateForeignTask() {
    firebase
      .database()
      .ref("Tasks")
      .child("-LJraTW2KV7BgcSZ8yJ6")
      .update({ status: 2 });
  }

  testingFBRules() {
    const taskID = firebase
      .database()
      .ref("Tasks")
      .push().key;

    var task_to_post = {
      taskID: taskID,
      posterID: firebase.auth().currentUser.uid,
      title: "test",
      desc: "test",
      creationDate: firebase.database().getServerTime(),
      //status: 0,
      workerID: ""
    };

    firebase
      .database()
      .ref("Tasks")
      .child(taskID)
      .set(task_to_post)
      .then(res => {
        var temp;
        alert("res : " + res);
      })
      .catch(error => {
        var temp;
        alert("err: " + error);
      });
  }

我已經注釋了testingFBRules()上的狀態道具,以便能夠發布任務。 我可以想象觸發一個雲功能,以在以后添加具有管理員權限的狀態。 但是我不確定這是否是正確的方法。

我的問題是,如何設置firebase規則以符合我的要求。 如果不可能,那么我應該如何重組數據庫以使其成為可能?

許可一旦授予,就不能撤消。 授予用戶訪問路徑的權限后,他們也可以訪問該路徑下的所有數據。 這意味着:

".write": "auth != null", //Users can post tasks
"$taskID":{
  // Only the owner of the task can edit its props
  ".write": "root.child('Tasks').child('$taskID').child('posterID').val() === auth.uid",
    // But the status is for nobody editable
    "status": {
        ".write": false
    }
}

這里的頂級規則意味着任何用戶( auth != null )都可以編寫所有任務。 他們也可以寫status ,盡管是".write": false 那里的其他.write規則似乎也沒有意義,因為它似乎在嘗試加強訪問。

您通常會希望結構化數據以符合安全要求。 這意味着我將在與其他任務數據不同的分支中對狀態進行建模:

Tasks
  $taskId
    posterId: ...
    workerId: ...
Status
  $taskId: 2

現在,您可以保護每個分支的安全訪問,僅允許用戶寫入/Tasks (因為/Status由服務器管理)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM