Firestore安全规则参照roles集合配置external角色读写权限失败如何解决
规则编写的核心错误
- 第一:
get()函数仅支持读取单个文档,你传入的/databases/$(database)/documents/roles是roles集合的根路径,不属于单文档路径,该调用本身就会直接失败,导致规则完全不生效。 - 第二:你对roles集合的存储结构访问逻辑错误。从常规设计及你提供的存储结构来看,用户的角色信息是以用户UID为文档ID,存储在roles集合下的单个文档中,而非作为字段存在于roles集合根节点上。
正确的规则写法
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 抽离公用的角色获取逻辑,方便后续其他规则复用 function getUserRole() { return get(/databases/$(database)/documents/roles/$(request.auth.uid)).data.role; } match /trainingRequests/{tId} { allow read, write: if // 先校验用户已登录 request.auth != null && // 校验该用户存在对应的角色文档 exists(/databases/$(database)/documents/roles/$(request.auth.uid)) && // 校验角色符合要求 getUserRole() == "external"; } } }
额外注意事项
- 该实现方案每次请求trainingRequests的读写权限时,都会产生1次roles文档的读取费用,高频访问时会额外增加成本。
- 必须保证roles集合下的文档ID和用户UID完全一致,且每个文档都存在
role字段,否则规则会直接拒绝访问。
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

