我尝试在Firebase Firestore中实现此规则,以便在登录用户的角色为“admin”* 时访问“users”表的数据(其中包含某些人的姓名和年龄)*。我有两张table:
角色(其中每个文档都与注册用户具有相同的ID),字段*“role”可取值为“admin”**
用户仅包含姓名和年龄, 只能由登录的管理员访问 *。
这是我写的规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{document} {
allow read: if get(/databases/$(database)/documents/roles/$(request.auth.id)/role) == "admin"
}
}
}
在规则Playground内的firebase控制台中,通过尝试以身份验证用户(角色为“admin”)的身份执行get,使用以下路径/users/RaafvyRPWYuN3IyqdoBa
,我得到一条红色消息,显示 “模拟阅读已被拒绝”
- 需要注意的是,在
/users/RaafvyRPWYuN3IyqdoBa
中,代码实际上是“users”表中列出的其中一个人的ID *
下面是我在Firestore中的数据库的图片。
有谁能帮我理解为什么规则没有发挥应有的作用?
1条答案
按热度按时间6yt4nkrj1#
在规则中使用
get()
时,必须仅提供要获取的文档的完整路径。不能使用路径访问文档中的字段。一旦你获取了一个文档,那么你就可以使用点表示法进入它的字段。其次,要在规则中使用经过身份验证的用户的uid,请使用
request.auth.uid
(而不是“id”)。我建议您熟悉有关访问其他文档的文档,以了解有关如何工作的更多细节和示例。