代码之家  ›  专栏  ›  技术社区  ›  nixn

用Firebase规则构造数据

  •  0
  • nixn  · 技术社区  · 6 年前

    我已经创建了一个应用程序,用户可以在其中发布 Tasks . 注册用户可以看到其他用户任务,但不应允许编辑这些任务,除非用户是该任务的海报。

    我直到现在才建立firebase规则,所以所有内容都可以被删除或阅读。我会尽我所能地解释我想完成的事情。

    • 地位
    • 工作区

    状态不应该由任务海报或其他任何人编辑,它应该由服务器功能处理。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);
          });
      }
    

    我的问题是,如何设置firebase规则来满足我的需求。如果这是不可能的,我应该如何重组我的数据库,使之成为可能?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Frank van Puffelen    6 年前

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

    ".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