如何检查安全规则的不同集合中的新文档?
问题描述:
所以在实时数据库中,我可以通过安全规则中的newData().parent().parent()...parent()
来检查新数据在各种路径中的写入情况。如何检查安全规则的不同集合中的新文档?
例如
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()
函数,但它仅适用于现有文档,而不是即将写入的内容。
答
不幸的是,目前在Cloud Firestore规则中没有相同的功能。您可以使用request.resource.data
来检查请求中正在写入的数据,但批量写入在规则中会被视为单独的请求,并且无法检查实时数据库中所有写入(如newData
)的净影响。不过,我们正在考虑将此添加到Cloud Firestore。
如果有帮助的话,这个特定的用例也许可以在没有扇出的情况下解决,因为您可以执行usersRef.where('username', '==' 'foobar').get()
查询来获取用户的特定用户名。
我想避免这种情况,因为有2个单独的事务来保存用户和用户名可能会导致数据质量问题(例如,如果第二个事务永远不会因为用户突然失去互联网或关闭应用程序而被保存,会怎么样)。由于这些完全相同的原因,我写的90%是批量的。作为一种解决方法,所有这些写入都在云端函数中,这对我来说并不理想。我希望这个功能很快登陆Cloud Firestore!谢谢! – rmmmp
对不起,我解释得很不好。我的意思是说,你可以通过摆脱“用户名”集合,直接查询“用户”来避免扇出,从而避免需要写入两个不同的地方并使用两个事务。 –
但我如何确保每个用户的用户名都应该是唯一的?我不打算将它作为关键字,因为我们希望使用户名可以更改。 – rmmmp