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

Firestore权限拒绝问题:用户仅读写自身数据规则无效

解决Firestore权限拒绝问题(仅用户读写自身数据)

问题根源

你触发权限错误的核心原因是快照代码监听了整个users集合,而你的安全规则只允许用户读写自己UID对应的单个文档,读取整个集合的请求会被规则拦截。

步骤1:确认Firestore安全规则正确性

先确保你的规则是针对单个用户文档配置的,正确规则示例:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

这个规则确保只有登录用户能读写自己UID对应的users文档,无法访问其他用户的文档或整个集合。

步骤2:修改快照监听代码

将监听整个集合的逻辑改为监听当前用户的单个文档,代码修改如下:

const getUser = () => {
  const currentUser = auth.currentUser;
  if (!currentUser) {
    setUser(null);
    return () => {};
  }

  // 创建当前用户的文档引用
  const userDocRef = doc(db, 'users', currentUser.uid);
  const subscriber = onSnapshot(userDocRef, (docSnapshot) => {
    if (docSnapshot.exists()) {
      // 单个文档数据直接赋值,无需遍历集合
      setUser({ ...docSnapshot.data(), key: docSnapshot.id });
      console.log(docSnapshot.data());
    } else {
      // 处理用户文档不存在的情况(比如注册后未写入)
      setUser(null);
      console.log("用户文档不存在");
    }
  }, (error) => {
    console.error("快照监听错误:", error);
  });

  return () => subscriber();
};

额外注意事项

  • 注册时的写入逻辑是正确的,因为你用用户UID作为文档ID写入,符合安全规则要求。
  • 确保调用getUser时用户已完成登录,否则auth.currentUser会为null,需要提前处理未登录状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:15:38