Firebase实时数据库规则(所有人都可以读取,但只能编辑所有者)

toa*_*sty 4 nosql firebase firebase-realtime-database

到目前为止,我一直在使用此规则配置

{
  "rules": {
    "items": {
      ".read" : true,
      "$uid": {
        ".read" : true,
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

验证和其他目录被省略。/ items / user1 / item1 / items / user2 / item1

全部可以读取项目目录和所有用户项目(无私有项目)

我需要什么?

平面项目

"items" : {
     "item1": {},
     "item2": {}
}
Run Code Online (Sandbox Code Playgroud)

以userId作为属性

"item1" : {
    "uid": "userId"
}
Run Code Online (Sandbox Code Playgroud)

只有用户创建的项目可以编辑/删除,但所有人都可以看到。

我在考虑不同目录中的重复项,例如

"public_items": {
         "item1": {},
         "item2": {}
}


"items": {
   "userId": {
      "item1": {},
      "item2": {},
   }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不是一个好主意。

规则以原子方式应用。这意味着,如果该位置或父位置没有授予访问权限的规则,则读取或写入操作将立即失败。即使可以访问每个受影响的子路径,在父位置的读取也将完全失败。 https://firebase.google.com/docs/database/security/securing-data#read_and_write_rules_cascade

如果不能将规则应用于每个项目,则如何用不同的所有者构建项目目录?

ado*_*srs 5

您只能使用来处理此问题/items/itemId/uid

{
  "rules": {
    "items": {
        ".read" : true,
        "$itemId": {
            ".write": "(!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)"
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以上规则是一种可能的解决方案。我们允许任何人阅读其中的所有内容items。但只有拥有项目(/itemId/uid)的用户才能创建/编辑。另外,我们强制新的或编辑的项目具有用户ID。