Firebase复杂规则

时间:2017-03-15 08:59:28

标签: firebase firebase-realtime-database firebase-security

假设我的Firebase数据库中有以下数据结构:

{
  "allProjects": {
    "foo": true,
    "bar": true,
    "baz": true
  },
  "allUsers": {
    "user1": true,
    "user2": true,
    "user3": true
  },
  "projects": {
    "foo": {
      "name": "foo",
      "members": {
        "user1": true
      }
    },
    "bar": {
      "name": "bar",
      "members": {
        "user2": true
      }
    },
    "baz": {
      "name": "baz",
      "members": {
        "user1": true,
        "user3": true
      }
    }
  },
  "users": {
    "user1": {
      "name": "user1"
    },
    "user2": {
      "name": "user2"
    },
    "user3": {
      "name": "user3"
    }
  }
}

问题

我正在尝试编写一些规则,以便保护我的数据。以下是一些要求:

  1. 用户应该只看到他们所属的项目(即/project/:id/members/:userId === true
  2. 用户应该只能看到属于与他们相同的项目的用户。
  3. 这是我能够提出的:

    {
      ".read": false,
      ".write": false,
      "allProjects": {
        ".read": "auth !== null"
      },
      "allUsers": {
        ".read": "auth !== null"
      },
      "projects": {
        "$projectId": {
          // requirement 1
          ".read": "data.child('members').hasChild(auth.uid)"
        }
      },
      "users": {
        "$userId": {
          // requirement 2
          ".read": "???",
        }
      }
    }
    

1 个答案:

答案 0 :(得分:2)

典型的方法是保留每个用户可以看到的用户列表。

user_friends: {
  "user1": {
    "user3": true
  }
  "user3": {
    "user1": true
  }
}

然后,当用户添加到项目中或从项目中删除时,您需要使此派生列表保持最新。或者,您可以在计划维护操作中计算此派生列表。

像这样复制数据是SQL数据库和大多数NoSQL数据库之间的重大差异之一。在Firebase中,我们经常存储额外的数据以允许我们的用例。要获得精彩的介绍,我建议您阅读NoSQL data modeling并观看Firebase for SQL developers

顺便说一下,我注意到您已将元数据合并到/projects/$projectid下的用户列表中。不建议这样做。为获得最佳效果,请将它们拆分为两个顶级列表。

  "projects": {
    "foo": {
      "name": "foo",
    },
    "bar": {
      "name": "bar",
    },
    "baz": {
      "name": "baz",
    }
  },
  "members": {
    "foo": {
        "user1": true
    },
    "bar": {
        "user2": true
    },
    "baz": {
        "user1": true,
        "user3": true
    }
  },