使用Firebase删除Budget时遇权限拒绝,请求排查问题原因
Firestore删除Budget操作权限拒绝问题排查
问题场景
使用Firebase Firestore开发时,创建Budget的操作可正常执行,但删除已创建的Budget时触发权限拒绝错误。
当前安全规则
// Budgets match /budgets/{budget} { allow read: if request.auth != null; allow update, delete, create: if request.auth != null && request.auth.uid == request.resource.data.userId; }
触发的错误信息
FirebaseError: [code=permission-denied]: Missing or insufficient permissions.
删除操作的代码实现
async function deleteBudget({ id }) { try { const budgetToDeleteQuery = query(collection(db, 'budgets'), where('id', '==', id), where('userId', '==', currentUser?.uid)); const budgetToDeleteData = await getDocs(budgetToDeleteQuery); const budgetToDelete = doc(db, 'budgets', budgetToDeleteData.docs[0].id); await deleteDoc(budgetToDelete); } catch (error) { alert(error); } // setBudgets(prevState => prevState.filter(item => item.id !== id)); }
问题原因及修复方案
核心原因
删除操作的安全规则中使用了request.resource.data.userId,但删除操作时不存在request.resource——这个字段仅在创建、更新这类需要写入新数据的操作中有效,删除操作没有待写入的资源,因此该字段为null,导致规则判断request.auth.uid == null不成立,触发权限拒绝。
规则修正方案
删除操作需要校验的是Firestore中已存储的文档的userId字段,应使用resource.data.userId(无request.前缀),它代表当前文档的现有数据。
修改后的安全规则:
// Budgets match /budgets/{budget} { allow read: if request.auth != null; allow create: if request.auth != null && request.auth.uid == request.resource.data.userId; allow update, delete: if request.auth != null && request.auth.uid == resource.data.userId; }
拆分规则后:
- 创建操作仍用
request.resource.data.userId验证提交的新数据中的userId与当前用户匹配 - 更新、删除操作改用
resource.data.userId验证现有文档的userId与当前用户匹配
内容的提问来源于stack exchange,提问作者Seva Sleva
相关产品推荐
相关产品推荐

