我试图仅允许其子级为“ A_Key”的Firebase表写入/更新。我设法在Firebase规则模拟器中阻止了“设置”,但无法阻止“更新”。 “更新”模拟总是成功的。
我尝试将其写到表中。
PYTHONIOENCODING=UTF-8 python3 -c 'print(b"\xf2a27".decode("latin1"), end="")' | wc -c
# will output 5
PYTHONIOENCODING=latin1 python3 -c 'print(b"\xf2a27".decode("latin1"), end="")' | wc -c
# will output 4
这是我的规则
{
"objectId" : "XXaabb",
"value" : 135
}
模拟集被拒绝。这就是我想要的。 然而 允许模拟更新。这不是我想要的。
我想要的结果是两个都应该被拒绝。
答案 0 :(得分:0)
如果您希望在设置时在数据中包含A_key,并且在更新此数据时应再次具有A_key的值,然后使用以下规则:
"myTable": {
"$uid": {
".write": "(((data.val() == null && (auth.uid == $uid)) && newData.child('A_key').val() != null) || (((data.val() != null && newData.val() != null) && (auth.uid == $uid)) && data.child('A_key').val() != null))",
".read": "(auth.uid == $uid)"
}
}
等效螺栓:
path /myTable/{uid} {
read() {isCurrentUser(uid)}
create() {isCurrentUser(uid) && this.A_key != null}
update() {isCurrentUser(uid) && prior(this.A_key) != null}
}
isCurrentUser(id) {
auth.uid == id
}
如果您希望在更新时不更改A_key的值,请使用以下方法:
"myTable": {
"$uid": {
".write": "(((data.val() == null && (auth.uid == $uid)) && newData.child('A_key').val() != null) || (((data.val() != null && newData.val() != null) && (auth.uid == $uid)) && data.child('A_key').val() == newData.child('A_key').val()))",
".read": "(auth.uid == $uid)"
}
}
等效螺栓:
path /myTable/{uid} {
read() {isCurrentUser(uid)}
create() {isCurrentUser(uid) && this.A_key != null}
update() {isCurrentUser(uid) && prior(this.A_key) == this.A_key}
}
isCurrentUser(id) {
auth.uid == id
}
https://github.com/FirebaseExtended/bolt/blob/master/docs/guide.md
答案 1 :(得分:0)
我做了一个小小的改动,现在可以了
newData.hasChild('A_Key')
应该是
newData.child('A_Key').exists()