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; } } }
额外检查项
- 确认调用
fetchUserDetails时传入的userId确实是当前用户的UID,可在函数中加日志验证:console.log('Current user UID:', auth.currentUser?.uid) - 确认管理员用户的
user_type自定义声明已正确设置到Firebase Auth的token中,可通过auth.currentUser?.getIdTokenResult()查看token内容。
内容的提问来源于stack exchange,提问作者lydonuis
相关产品推荐
相关产品推荐

