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

Firestore规则模拟正常但React Native应用权限不足问题排查

问题分析与解决方案

第一套规则失效原因

第一套规则用递归匹配/{users=**},覆盖了users集合下所有层级的文档(包括子集合addresses的文档)。但isOwner()函数里用resource.id判断权限:

function isOwner() {
  return request.auth != null && request.auth.uid == resource.id;
}

读取addresses子集合时,resource.id指的是地址文档的ID,而非用户UID,普通用户访问自身地址数据时,request.auth.uid == resource.id不成立,触发权限不足错误。

第二套规则失效原因

第二套规则仅匹配了/users/{userId}路径,没给users/{userId}/addresses这类子集合设置权限规则。Firestore规则默认拒绝所有未明确允许的访问,所以不管管理员还是普通用户,读取子集合都会被拒绝。

修正后的规则方案

方案一:明确匹配用户文档与子集合

通过嵌套匹配覆盖用户文档及其所有子集合,把用户UID传递到子集合规则里验证:

service cloud.firestore {
  match /databases/{database}/documents {
    
    match /users/{userId} {
      allow read: if isOwner(userId) || isAdmin();
      allow write: if isOwner(userId);
      
      // 匹配该用户下所有子集合及文档
      match /{subcollection}/{document=**} {
        allow read: if isOwner(userId) || isAdmin();
        allow write: if isOwner(userId);
      }
    }
    
    function isOwner(userId) {
      return request.auth != null && request.auth.uid == userId;
    }
    
    function isAdmin() {
        return request.auth != null && request.auth.token.user_type == 3;
    }
  }
}

方案二:递归匹配用户路径

用{rest=**}递归匹配用户UID下的所有层级,直接通过路径参数userId验证权限:

service cloud.firestore {
  match /databases/{database}/documents {
    // 匹配users/{userId}及其下所有子路径
    match /users/{userId}/{rest=**} {
      allow read: if isOwner(userId) || isAdmin();
      allow write: if isOwner(userId);
    }
    
    function isOwner(userId) {
      return request.auth != null && request.auth.uid == userId;
    }
    
    function isAdmin() {
        return request.auth != null && request.auth.token.user_type == 3;
    }
  }
}

额外检查项

  1. 确认调用fetchUserDetails时传入的userId确实是当前用户的UID,可在函数中加日志验证:console.log('Current user UID:', auth.currentUser?.uid)
  2. 确认管理员用户的user_type自定义声明已正确设置到Firebase Auth的token中,可通过auth.currentUser?.getIdTokenResult()查看token内容。

内容的提问来源于stack exchange,提问作者lydonuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:37:03