You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:05:42