firebase 基于角色的Cloud Firestore访问规则将不起作用

baubqpgj  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(114)

我尝试在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中的数据库的图片。

有谁能帮我理解为什么规则没有发挥应有的作用?

6yt4nkrj

6yt4nkrj1#

在规则中使用get()时,必须仅提供要获取的文档的完整路径。不能使用路径访问文档中的字段。一旦你获取了一个文档,那么你就可以使用点表示法进入它的字段。
其次,要在规则中使用经过身份验证的用户的uid,请使用request.auth.uid(而不是“id”)。

allow read: if get(/databases/$(database)/documents/roles/$(request.auth.uid)).data.role == "admin"

我建议您熟悉有关访问其他文档的文档,以了解有关如何工作的更多细节和示例。

相关问题