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

排查Cloud Firestore/Firebase安全规则失效问题

排查Firestore安全规则中getUserId()函数返回值异常的问题

可能的问题点及排查步骤

  1. 映射文档路径与权限问题

    • 确认userMappings集合的文档ID是Firebase Auth的UID,规则中get()的路径要严格对应,比如:
      function getUserId() {
        return get(/databases/$(database)/documents/userMappings/$(request.auth.uid)).data.uuid;
      }
      
    • 检查userMappings的安全规则,确保当前认证用户能读取自己的映射文档:
      match /userMappings/{firebaseUid} {
        allow read, write: if request.auth.uid == firebaseUid;
      }
      
    • 验证映射文档确实存在,且uuid字段值正确(注意字段名大小写、拼写,确保是字符串类型)。
  2. 规则函数执行上下文问题

    • 确保调用规则时用户已完成Firebase Auth认证,request.auth.uid不为空(离线状态下Firestore使用缓存,权限检查仍依赖在线时的认证状态)。
    • 处理映射文档不存在的场景,避免get()抛出错误导致规则直接拒绝:
      function getUserId() {
        let mappingDoc = get(/databases/$(database)/documents/userMappings/$(request.auth.uid));
        return mappingDoc.exists ? mappingDoc.data.uuid : null;
      }
      
      同时在users集合规则中增加非空判断:allow read: if request.auth != null && getUserId() == resource.data.userId;
  3. 规则函数写法错误

    • 检查路径中的$(database)变量是否正确引用,避免因数据库路径错误导致读取失败;
    • 确认函数返回值类型与users集合中userId字段类型一致(均为字符串)。

测试函数返回值的方法

  1. 使用Firebase规则模拟器

    • 进入Firebase控制台的Firestore规则页面,打开「规则模拟器」;
    • 选择测试操作(如读取users集合文档),设置认证用户的UID(对应userMappings中的文档ID);
    • 在规则函数中添加日志输出,查看返回值:
      function getUserId() {
        let mappingDoc = get(/databases/$(database)/documents/userMappings/$(request.auth.uid));
        log("映射文档数据:", mappingDoc.data);
        log("提取的UUID:", mappingDoc.data.uuid);
        return mappingDoc.data.uuid;
      }
      
      运行测试后,在模拟器日志中确认获取的UUID是否正确,或是否存在文档不存在的错误。
  2. Flutter代码中手动验证

    • 在同步Firestore之前,手动读取当前用户的映射文档,打印数据确认字段正确性:
      final currentUser = FirebaseAuth.instance.currentUser;
      if (currentUser != null) {
        final mappingDoc = await FirebaseFirestore.instance
            .collection('userMappings')
            .doc(currentUser.uid)
            .get();
        print("映射文档内容:${mappingDoc.data()}");
      }
      
      如果这里读取失败,说明userMappings的规则或文档存在问题。
  3. 规则中直接输出对比日志

    • 在users集合的规则中添加日志,对比getUserId()返回值与目标userId:
      match /users/{userId} {
        allow read: if request.auth != null && getUserId() == userId;
        log("getUserId()返回值:", getUserId());
        log("当前请求的userId:", userId);
        log("用户Auth UID:", request.auth.uid);
      }
      
      运行测试后,通过日志判断返回值是否与预期匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:56:09