Firebase安全规则如何根据Users集合admin属性控制Nouns集合写权限
问题原因
- 规则中
resource.data.admin的引用对象错误:resource指代的是当前你正在访问的Nouns集合下的目标文档,而非当前登录用户对应的Users集合文档,如果Nouns文档本身没有admin字段,就会抛出属性未定义的错误。 - 重复定义了Nouns集合的匹配规则:Firebase Security Rules是「只要任意一个匹配块的条件满足就允许访问」,你写了两个
match /Nouns/{documents=**}块,第一个块已经给所有登录用户开放了读权限,和你预期的权限逻辑不符。 - 没有主动获取Users集合中当前用户的文档数据做admin属性校验:你需要手动拉取当前登录用户uid对应的Users文档,才能校验其admin字段值。
修正后的规则
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /Users/{userId}/{documents=**} { allow read, write: if request.auth != null && request.auth.uid == userId } match /Nouns/{documents=**} { // 所有登录用户可读 allow read: if request.auth != null // 仅自身Users文档admin为true的用户可写 allow write: if request.auth != null && exists(/databases/$(database)/documents/Users/$(request.auth.uid)) && get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.admin == true } } }
规则说明
- 用
get()方法主动获取当前登录用户uid对应的Users集合文档,读取该文档的admin属性做校验 - 增加
exists()判断避免用户对应的Users文档不存在时抛出异常 - 合并了Nouns集合的两个匹配块,避免规则冲突
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

