为何实现如下代码仍出现Firebase权限拒绝错误?
为啥你的React Native + Firestore会出现权限拒绝错误?
嘿,我来帮你拆解下这个问题的常见原因,大概率和Firestore的规则或者认证流程有关:
1. Firestore安全规则没配置对(最可能的元凶)
你提到Firestore规则内容不完整,这几乎就是问题所在了。默认的Firestore规则要么是完全关闭(只允许控制台访问),要么是只要求用户登录,但没细化到“用户只能访问自己的数据”。
你的代码里访问的是users/{当前用户UID}/memos这个子集合,对应的安全规则得明确授权:只有登录用户能访问自己UID下的memos内容。正确的规则应该是这样的:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 限定只有当前登录用户能读写自己的memos子集合 match /users/{userId}/memos/{memoId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
如果你的规则没这么配置,Firestore自然会拒绝访问请求,抛出permission denied。
2. 用户认证状态还没稳定就请求数据
你在componentWillMount里直接拿currentUser,但要注意:App刚启动时,Firebase的认证状态可能还没初始化完成,这时候currentUser可能是null。用null的UID去访问集合,肯定会触发权限错误。
建议改成监听认证状态变化,等用户状态稳定后再请求数据:
componentWillMount() { // 监听用户认证状态,确保拿到有效用户后再请求数据 firebase.auth().onAuthStateChanged((user) => { if (user) { const db = firebase.firestore(); const settings = { timestampsInSnapshots: true }; db.settings(settings); db.collection(`users/${user.uid}/memos`) .onSnapshot((snapshot) => { const memoList = []; snapshot.forEach((doc) => { memoList.push({ ...doc.data(), key: doc.id }); }); this.setState({ memoList }); }); } else { console.log("用户还没登录哦,先处理登录流程吧"); } }); }
3. 集合路径和数据结构不匹配
再检查下你的Firestore数据结构:是不是users集合下有个以用户UID命名的文档,然后这个文档里有memos子集合?如果你的数据结构是memos集合里的每个文档都带userId字段(用来关联用户),那你代码里的路径写法就错了,应该改成db.collection('memos').where('userId', '==', user.uid),同时安全规则也要对应调整成检查文档里的userId字段和当前用户UID一致。
内容的提问来源于stack exchange,提问作者abcz
相关产品推荐
相关产品推荐

