Firebase returns 对随机 setValue() 子数据的权限被拒绝
Firebase returns permission denied on random setValue() child data
我正在测试 Firebase 规则以增加 Firebase 数据库中数据条目的安全性。我想确保:
只有 Firebase Authenticated "users" 才能 read/write 自己的账户信息进入 "accounts"
只有 Firebase Authenticated "users" 才能 read/write 将自己的字符数据转化为 "messages"。
为此我编写了以下规则:
{
"rules": {
"account": {
"$uid": {
".read": "auth.uid === $uid",
".write": "auth.uid === $uid"
}
},
"messages": {
"$message_id": {
".read": "auth !== null",
".write": "auth.uid === newData.child('_uid').val() &&
root.child('account').hasChild(auth.uid) === true"
},
}
}
}
上面的规则看起来是正确的,但是我在我推入的 "messages" 个子节点的 (3) 上得到了 "failed: DatabaseError: Permission denied"已登录的用户帐户。
这是我推送到 firebase 方法的代码片段:
public void saveToFirebase(){
String echo = "";
String _uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference mCurrentRecord = mFirebaseGame.push();
Log.d(LOG, "User is " + _uid + "\nNew record ID: " + mCurrentRecord.getKey());
gameCharacter.map.put("_uid", _uid);
try{
for(String keys : gameCharacter.map.keySet()){
echo += keys + ":" + gameCharacter.map.get(keys) + "\n";
mCurrentRecord.child(keys).setValue(gameCharacter.map.get(keys));
}
}
catch(Exception e){
error = e.toString();
}
}
这是我收到的权限被拒绝的错误:
我无法理解为什么只有子节点 "txtStr, txtCharName and txtEner" 会出现权限被拒绝的错误,而其余节点已成功推送到数据库。
如果我遗漏了我的 Firebase 规则结构中的任何内容或任何内容,希望您能指出。谢谢。
这个问题的正确答案正如@Frank van Puffelen 指出的那样,通过调用 mCurrentRecord.setValue(gameCharacter.map)[=16 一次插入所有子节点值=],而不是迭代将数据单独放入 setValue()。
这是因为 "messages" 规则,它检查 newData 中的一组批量插入的子节点。
"messages": {
"$message_id": {
".read": "auth !== null",
".write": "auth.uid === newData.child('_uid').val() &&
root.child('account').hasChild(auth.uid) === true"
},
}
我正在测试 Firebase 规则以增加 Firebase 数据库中数据条目的安全性。我想确保:
只有 Firebase Authenticated "users" 才能 read/write 自己的账户信息进入 "accounts"
只有 Firebase Authenticated "users" 才能 read/write 将自己的字符数据转化为 "messages"。
为此我编写了以下规则:
{
"rules": {
"account": {
"$uid": {
".read": "auth.uid === $uid",
".write": "auth.uid === $uid"
}
},
"messages": {
"$message_id": {
".read": "auth !== null",
".write": "auth.uid === newData.child('_uid').val() &&
root.child('account').hasChild(auth.uid) === true"
},
}
}
}
上面的规则看起来是正确的,但是我在我推入的 "messages" 个子节点的 (3) 上得到了 "failed: DatabaseError: Permission denied"已登录的用户帐户。
这是我推送到 firebase 方法的代码片段:
public void saveToFirebase(){
String echo = "";
String _uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference mCurrentRecord = mFirebaseGame.push();
Log.d(LOG, "User is " + _uid + "\nNew record ID: " + mCurrentRecord.getKey());
gameCharacter.map.put("_uid", _uid);
try{
for(String keys : gameCharacter.map.keySet()){
echo += keys + ":" + gameCharacter.map.get(keys) + "\n";
mCurrentRecord.child(keys).setValue(gameCharacter.map.get(keys));
}
}
catch(Exception e){
error = e.toString();
}
}
这是我收到的权限被拒绝的错误:
我无法理解为什么只有子节点 "txtStr, txtCharName and txtEner" 会出现权限被拒绝的错误,而其余节点已成功推送到数据库。
如果我遗漏了我的 Firebase 规则结构中的任何内容或任何内容,希望您能指出。谢谢。
这个问题的正确答案正如@Frank van Puffelen 指出的那样,通过调用 mCurrentRecord.setValue(gameCharacter.map)[=16 一次插入所有子节点值=],而不是迭代将数据单独放入 setValue()。
这是因为 "messages" 规则,它检查 newData 中的一组批量插入的子节点。
"messages": {
"$message_id": {
".read": "auth !== null",
".write": "auth.uid === newData.child('_uid').val() &&
root.child('account').hasChild(auth.uid) === true"
},
}