我的数据库结构是:
users
david@gmail.com
records
ApK2DFpG87NDGYutgAVO
pulse: 80
Bryd87NAS20dfDGYtghg
pulse: 78
eva@fb.com
records
A81hxASDKH38dhaj9321
pulse: 93
A82ndasklih38ASD2eda
pulse: 67
规则是:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{email} {
allow create, read, update, delete: if request.auth.token.email == email;
}
}
}
我希望每个用户(例如foo@gmail.com
(只能在该用户(users/foo@gmail.com/**
(下读取和写入数据。
当我在Rules操场上阅读users/me@gmail.com
时(当我被认证为me@gmail.com
时(,正如预期的那样,我得到了"允许模拟阅读"。
然而,当我从我的应用程序中读取users/me@gmail.com/records
(同时被验证为me@gmail.com
(时,我得到:
FirebaseError:缺少或权限不足。
我缺少什么?
顺便问一下,为什么规则操场不允许阅读集合(例如users/me@gmail.com/records
(?上面写着:
路径必须是文档级
您应该利用安全规则版本2的递归通配符,如下所示:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{email}/{document=**} {
allow create, read, update, delete: if request.auth.token.email == email;
}
}
}
如文档中所述,它将匹配users
集合的任何子集合中的文档以及users
集合中的文件。
顺便说一句,为什么规则操场不允许阅读集合
如果我没有弄错的话,这是因为规则不是过滤器,因此您需要在"规则游戏场"中准确指定要针对的文档。