如何设置允许经过身份验证的用户只读取和写入自己的数据的Firebase规则



我的数据库结构是:

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集合中的文件。


顺便说一句,为什么规则操场不允许阅读集合

如果我没有弄错的话,这是因为规则不是过滤器,因此您需要在"规则游戏场"中准确指定要针对的文档。