Angular使用Firestore配置用户自有数据权限时出现权限不足及登录异常问题
问题成因及解决方案
1. 初始规则写入子集合权限不足的原因
Firestore安全规则默认不会递归匹配父文档下的子集合,你初始配置的规则仅对/users/{uid}这个父级文档本身生效,而业务代码中写入的是/users/{uid}/shipped、/users/{uid}/preordered这类子集合下的文档,没有匹配到任何权限规则,Firestore默认拒绝所有未匹配到规则的请求,因此抛出权限不足错误。
2. 改用递归通配后登录失败、注册正常的原因
你调整为match /users/{user=**}的递归规则后,存在两个逻辑问题:
- 通配符捕获的变量名从原来的
uid变成了user,原有规则中request.auth.uid == uid的判断条件里uid变量不存在,条件永远不成立 - 注册流程是首次创建
/users/{uid}文档,触发create权限校验,create仅要求request.auth != null,满足条件所以功能正常;而登录流程调用setUserData时使用{merge: true}配置,若用户文档已存在,此时触发的是update权限校验,需要满足身份匹配条件,因为变量不匹配导致条件不成立,因此触发权限不足。
3. 最终修复方案
推荐使用显式匹配的安全规则,逻辑更清晰可控:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{uid} { allow create: if request.auth != null; allow read, update, delete: if request.auth != null && request.auth.uid == uid; // 匹配当前用户下所有子集合的权限 match /{document=**} { allow read, write: if request.auth != null && request.auth.uid == uid; } } } }
额外注意:需要确保调用addToOrders方法时,authService.currentUser已经完成认证初始化,避免取到空的uid导致权限校验失败。
内容的提问来源于stack exchange,提问作者ACDev
相关产品推荐
相关产品推荐

