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
相关产品推荐
相关产品推荐

