在Firebase中,我有一个users“节点”,看起来像:

users: {
  someUid: {
    username: 'someUsername'
    activeConversations: {},
    profile_picture: ''
    ... lots of other children
  },
  ...
},
anotherNode: {

},
... hundreds of other nodes

我现在的规则:
{
  "rules": {
    ".read": true,
    ".write": true,
    "users": {
      ".indexOn": [
        "username"
      ]
    },
    "friendRequests": {
      ".indexOn": [
        "timeSent"
      ]
    }
  }
}

我想做的是将users“节点”中的 child 访问权限仅限制给拥有 child 的客户端。因此,例如,someUid子级只能由客户端使用uid someUid写入。诸如anotherNode之类的其他“节点”可以由任何已登录的客户端写入/读取。
另外,任何登录的客户端都应该能够在profile_picture文档中的activeConversationsusers上进行书写。

如何实现这一目标而不必在每个节点上都设置读/写规则?

谢谢

最佳答案

我认为@Bradley Mackey差不多在那儿,但只需要进行一些微调即可。

{
  "rules": {
    "users": {
      ".indexOn": ["username"],
      // wildcard, matches any node under 'users'
      "$someUid": {
        "$other" : {
          ".read": "($other == 'profile_picture' || $other == 'activeConversations') || auth.uid == $someUid",
          ".write": "($other == 'profile_picture' || $other == 'activeConversations') || auth.uid == $someUid",
        }
      }
    },
    "$anythingelse": {
      ".read": "auth != null",
      ".write": "auth != null",
    }
  }
}
".validate":字段确保字段匹配特定格式。如果该字段是profile_picture或activeConversations,则此处的读写操作应使所有人都具有读写访问权限,并为用户提供对其他所有内容的访问权限。

编辑:

我添加了另一个规则,该规则允许对任何非用户节点的任何已登录用户进行读写访问。

08-25 11:08
查看更多