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

时间:2016-06-25 15:22:03

标签: firebase firebase-realtime-database nosql

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

{
  "rules": {
    "items": {
      ".read" : true,
      "$uid": {
        ".read" : true,
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

验证和其他目录省略。 /项目/用户1 /条1/1 / items / user2 / item1

所有人都可以阅读项目目录和所有用户项目(没有私人项目)

我需要什么?

平面项目

"items" : {
     "item1": {},
     "item2": {}
}

将userId作为属性

"item1" : {
    "uid": "userId"
}

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

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

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


"items": {
   "userId": {
      "item1": {},
      "item2": {},
   }
}

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

  

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

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

1 个答案:

答案 0 :(得分:4)

您只能使用/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)"
        }
    }
  }
}

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