因此,在实时数据库中,当我进行扇出写入时,我可以通过安全规则中的newData().parent().parent()...parent()
检查要在各种路径中写入的新数据。
e.g。
const fanout = {
'users/user_a': {
username: 'foobar'
},
'usernames': {
'foobar': 'user_a'
}
};
firebase.update(fanout);
这样的安全性:
"rules": {
"users": {
$user_id: {
"username": {
".validate": "newData.parent().parent().parent().child('usernames').child(newData.val()).val() == auth.uid;
}
}
},
"usernames": {
"$username": {
".validate": "newData.parent().parent().child('users').child(auth.uid).child('username').val() == $username"
}
}
}
如果想知道在Firestore的安全规则中是否有办法做到这一点?我已经看到了exists()
功能,但它仅适用于现有文档,而不是即将编写的文档。
答案 0 :(得分:0)
不幸的是,目前Cloud Firestore规则中没有相同的功能。您可以使用request.resource.data
检查请求中写入的数据,但批量写入在规则中被视为单独的请求,并且无法检查newData
所做的所有写入的净效果实时数据库。我们期待将来将此添加到Cloud Firestore。
如果它有用,这个特定的用例也许可以在没有扇出的情况下解决,因为你可以进行usersRef.where('username', '==' 'foobar').get()
查询以获得用户特定的用户名。