在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
文档中的activeConversations
和users
上进行书写。如何实现这一目标而不必在每个节点上都设置读/写规则?
谢谢
最佳答案
我认为@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,则此处的读写操作应使所有人都具有读写访问权限,并为用户提供对其他所有内容的访问权限。编辑:
我添加了另一个规则,该规则允许对任何非用户节点的任何已登录用户进行读写访问。