javascript - 使用 Firebase 规则构建数据

标签 javascript firebase firebase-realtime-database firebase-security

我创建了一个应用程序,用户可以在其中发布任务。注册用户可以查看其他用户的任务,但不得编辑它们,除非该用户是该任务的发布者。

直到现在我才设置 Firebase 规则,因此所有内容都可能被删除或读取。我将尽力以最好的方式解释我试图实现的目标。

如果我关注该节点中的主要任务 Prop ,它包含 3 个基本 Prop :

  • 状态
  • 海报ID
  • worker ID

状态不应该由任务发布者或其他任何人编辑,它应该由服务器功能处理。应该通过发布新任务来设置海报 ID,并且任何人都不能对其进行编辑。至于读取规则,注册用户可以读取任务的所有 Prop 。

我想避免服务器功能接受任务作为数据并通过数据库的管理员权限设置它,因为用户将无法以这种方式体验离线持久性。

我想出了这个“不太有效”的解决方案。我一直在测试是否可以编辑未由我的用户 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-rules 以满足我的要求。如果不可能,我应该如何重组我的数据库以使其成为可能?

最佳答案

权限一旦授予,就无法撤销。一旦用户被授予对路径的访问权限,他们也可以访问该路径下的所有数据。这意味着:

".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)都可以编写所有任务。尽管 ".write": false,他们也可以写入 status。那里的其他 .write 规则似乎也毫无意义,因为它似乎试图加强访问。

您通常希望构建数据以满足您的安全要求。这意味着我将在与其他任务数据不同的分支中对状态进行建模:

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

现在,您可以单独保护每个分支的访问,只允许用户写入 /Tasks (因为 /Status 由您的服务器管理)。

关于javascript - 使用 Firebase 规则构建数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51840332/

相关文章:

javascript - 在嵌套的 ng-repeat 中为我所在的任何对象动态抓取 Firebase 数据

javascript - JS for 循环不起作用

swift - 使用 FirebaseUI 删除 Firebase 数据库中的子项

javascript - Google Auth 用户电子邮件不存在

javascript - 最小化具有重复值 Javascript 的数组

javascript - Firebase 函数将错误的 key 写入 firebase 数据库

swift - 当 firebase 子项快速删除时,从本地字典中删除值

javascript - 提交 from,由 ajax 请求处理

javascript - Jquery 的空格问题

java - 如何在特定 Activity 完成时调用方法