我正在使用Firebase,我的用户设置如下:
{
"firebase-account-123": {
"users": {
"simplelogin:1": {
"properties"{ "name": "john doe", "email": "user@email.com" }
"children": {
"simplelogin:2":{ "name": "user 2", "email": "user2@email.com" },
}
},
"simplelogin:2": {
"properties"{ "name": "user 2", "email": "user2@email.com", "disabled": false }
}
}
}
我有客户经理应该有权访问的"子项"。我是新手,我正在尝试解决我遇到的一些权限问题。
我的规则目前只允许用户读取/写入自己的数据。
".read": "auth.uid == $userid", ".write": "auth.uid == $userid"
有谁知道我该如何做到这一点,以便他们也能够为其"子"对象中列出的用户写入/读取数据(可能只是在属性对象中)?
如果您希望允许 children
存储桶下列出的用户 ID 也读取和写入数据,请尝试在安全规则中使用 hasChild()
方法。
例如,使用上面概述的相同数据结构:
{
"rules": {
".read": false,
".write": false,
"users": {
"$userid": {
".read": "auth.uid == $userid",
".write": "auth.uid == $userid",
"properties": {
".read": "root.child('users').child(auth.uid).child('children').hasChild($userid)"
}
}
}
}
}
这样的事情应该可以解决问题:
".read": "auth.uid == $userid || root.child('users/'+auth.uid+'/children/'+$userid).exists()"
因此,在以下情况下,这将授予对节点的访问权限:
- 它是当前登录的用户自己的节点
- 当前登录的用户具有具有节点 ID 的子节点
我建议稍微清理一下数据结构以删除子项中的重复数据:
{
"firebase-account-123": {
"users": {
"simplelogin:1": {
"properties"{ "name": "john doe", "email": "user@email.com" }
"children": {
"simplelogin:2": true
}
},
"simplelogin:2": {
"properties"{ "name": "user 2", "email": "user2@email.com", "disabled": false }
}
}
}