jue*_*n d 3 json firebase firebase-security firebase-realtime-database
我有此Firebase数据库,如有必要可以更改:
该数据库的JSON是:
{
"groups": {
"1": {
"name": "G1",
"points": {
"1": {
"name": "p1"
}
},
"visits": {
"1": {
"name": "v1"
}
},
"areas": {
"1": {
"name": "a1"
}
},
"waypoints": {
"1": {
"name": "w1"
}
},
"interests": {
"1": {
"name": "i1"
}
}
},
"2": {
"name": "G2",
"points": {
"2": {
"name": "p2"
}
},
"visits": {
"2": {
"name": "v2"
}
},
"areas": {
"2": {
"name": "a2"
}
},
"waypoints": {
"2": {
"name": "w2"
}
},
"interests": {
"2": {
"name": "i2"
}
}
}
},
"users": {
"qdRw1khg1ZO1s52YioYCdM4WrD02": {
"firstName": "AAAA",
"lastName": "BBB",
"email": "sdf@sdfs.com"
},
"h3KYDXkPQrY246w6Y6NXIanVoNS2": {
"firstName": "FF",
"lastName": "RR",
"email": "wwf@jjuzhz.com"
}
},
"userGroups": {
"qdRw1khg1ZO1s52YioYCdM4WrD02": {
"1": "admin",
"2": "readwrite"
},
"h3KYDXkPQrY246w6Y6NXIanVoNS2": {
"1": "admin",
"2": "readonly"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想定义规则来完成以下任务:
我有:
"groups": {
"$groupId": {
".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
".write": "! root.child('userGroups').child(auth.uid).child($groupId).exists() ||
(data.parent().val() === 'points' && root.child('userGroups').child(auth.uid).child($groupId).val() != 'readonly') ||
(data.parent().val() === 'visits' && root.child('userGroups').child(auth.uid).child($groupId).val() === 'readonly') ||
(data.parent().val() != 'points' && data.parent().val() != 'visits' && root.child('userGroups').child(auth.uid).child($groupId).val() === 'admin')"
}
},
"users": {
"$userId": {
".read": "auth != null",
".write": "auth != null &&
$userId === auth.uid &&
newData.val() != null"
}
},
"userGroups": {
"$userId": {
".read": "auth != null",
".write": "auth != null &&
data.child(auth.uid).val() === 'admin' &&
newData.val() != null"
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为
data.parent().val()
Run Code Online (Sandbox Code Playgroud)
不返回父母的名字字符串。所以我做不到
data.parent().val() != 'points'
Run Code Online (Sandbox Code Playgroud)
如何解决呢?问题是根据指定的规则将数据写入组。
Firebaser在这里。我希望这个答案会随着我的更新而更新。
我的第一步是将特定子节点的规则移至该特定子节点。这消除了parent()您遇到的问题。第一次迭代是:
"groups": {
"$groupId": {
".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
"points": {
".write": "root.child('userGroups').child(auth.uid).child($groupId).val() !== 'readonly'"
}
}
},
Run Code Online (Sandbox Code Playgroud)
这允许用户h3KYDXkPQrY246w6Y6NXIanVoNS2写入/groups/1/points(用户是管理员),但不能写入/groups/2/points(用户仅具有只读访问权限)。
下一步是使规则更通用。为此,我引入了一个$child变量,该变量与组下的任何节点匹配:
"groups": {
"$groupId": {
".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
"$child": {
".write": "root.child('userGroups').child(auth.uid).child($groupId).val() !== 'readonly'
|| ($child !== 'points' && $child !== 'visits')"
}
}
Run Code Online (Sandbox Code Playgroud)
这允许用户h3KYDXkPQrY246w6Y6NXIanVoNS2写入/groups/2/name(任何组成员都可以写入),但不能写入/groups/2/points(用户仅具有只读访问权限)。
更新:显然我在上面颠倒了您的逻辑,所以这是我的最终看法:
"groups": {
"$groupId": {
".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
".write": "root.child('userGroups').child(auth.uid).child($groupId).val() == 'admin'",
"$child": {
".write": "root.child('userGroups').child(auth.uid).child($groupId).val() === 'readwrite'
&& ($child !== 'points' || $child !== 'visits')"
}
}
Run Code Online (Sandbox Code Playgroud)
与这个用户h3KYDXkPQrY246w6Y6NXIanVoNS2:
/groups/1/name因为他们是第1组的管理员/groups/2/points因为他们是第1组的管理员/groups/2/name因为他们不是第2组的管理员/groups/2/points因为它们是第2组的可读写成员| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |