Gra*_*ton 3 firebase google-cloud-platform google-cloud-firestore
我已经为 Firestore 编写了规则,但是,当文档不存在时,它会抛出“权限缺失或不足”错误。例如
firebase.firestore().collection('shipments').doc(order_doc_id)
.onSnapshot(fsResponse => {
...
)}
Run Code Online (Sandbox Code Playgroud)
order_doc_id当不存在时抛出“权限缺失或不足错误” 。
这是我的“shipments”集合的安全规则:
allow read: if request.auth != null && (resource.data.book_data.seller_id == request.auth.uid || resource.data.buyer_id == request.auth.uid)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望它能够成功解决fsResponse.exists === false,然后向用户显示“未找到”屏幕,但事实并非如此,并且该错误没有说明文档的存在。
处理此案的正确方法是什么?
这个答案建立在@RenaudTarnec的答案之上。
当前规则失败的原因是它们在不存在的文档上使用时会引发错误。任何引发错误的规则都会被视为该规则阻止访问。
您当前的阅读规则:
allow read: if request.auth != null
&& (resource.data.book_data.seller_id == request.auth.uid
|| resource.data.buyer_id == request.auth.uid);
Run Code Online (Sandbox Code Playgroud)
对于存在的文档,如果访问用户是卖方或买方,则规则允许读取访问。但是,当文档不存在时,resource将会- 这会导致语法错误,您尝试读取对象上的null属性- 阻止读取。在 Firebase 控制台的规则园地中测试规则时,您可以看到此行为的实际效果。datanull
要允许读取不存在的文档,您需要添加 -check nullfor resource. 为了防止滥用,您可能仍然希望要求用户登录。
allow read: if request.auth != null
&& (resource == null
|| resource.data.book_data.seller_id == request.auth.uid
|| resource.data.buyer_id == request.auth.uid);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1404 次 |
| 最近记录: |