【问题标题】:Firebase Firestore rules : How to check if the reference to document contains the uid of the requester?Firebase Firestore 规则:如何检查对文档的引用是否包含请求者的 uid?
【发布时间】:2021-12-26 17:41:03
【问题描述】:

我有一个带有集合users 的firestore 数据库,其中包含有关我的用户的信息。每个文档的 id 是 Firebase Auth 分配的用户 uid。

我有另一个名为 rooms 的集合,其中包含一个字段 users,它是文档引用列表,这些引用指向用户文档。

这是一个房间文档,其中有一个字段是对用户集合的引用列表。 /users/后面看到的字母是用户的uid,也是集合users中用户的文档id。

我还有一个名为owner 的字段,它是对集合usersuser 的文档引用。

我想创建一个 Firebase 规则,其中用户只能检索他所在的房间。

    match /rooms/{room} {
      allow read : if isLoggedIn() && isInRoom();
      allow create : if isLoggedIn();
      allow delete, update : if isLoggedIn() && isInRoom() && isRoomOwner();
    }

  function isLoggedIn() {
    return request.auth != null && request.auth.token.email_verified;
  }
  
  function isInRoom() {
    return request.auth.uid in resource.data.users;
  }

  function isRoomOwner() {
    return "users/"+request.auth.uid == resource.data.owner;
  }

所以这里,resource.data 指向一个房间文档,所以resource.data.users 是上图中看到的用户引用数组。所以resource.data.owner 指向用户集合中用户的单个文档引用。

但正如我在这个示例中所写的那样,它不起作用,因为 request.auth.uid 返回一个 uid 并且 resource.data.users 返回一个引用,类似于 users/uid。我尝试将resource.data.users 更改为"users/" + resource.data.users,但它不干净。

isRoomOwner 函数也有同样的问题,但在这里,resource.data.owner 只是一个文档参考,而不是文档参考列表。

谁能帮帮我?

【问题讨论】:

  • 如果您显示实际文档的示例,将更容易理解问题所在。 “resource.data.users 返回参考”是什么意思不是很清楚。您的意思是它是指向其他文档的类型引用字段吗?还是其他东西,比如字符串?具体内容。
  • 我同意@DougStevenson,通常这样的事情应该可以工作request.auth.uid == resource.data.userId,其中userId 是文档内的一个字段,其中包含所需的uid
  • 您能否编辑问题以显示我要求的有关您的文件的信息?
  • @DougStevenson,你去吧,我试图解释更多,并详细说明我的问题。
  • 提供完整路径有效吗? /databases/(default)/documents/users/$(request.auth.uid) == resource.data.owner(注意:这是路径,不是字符串,所以不要用引号括起来)

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

正如 samthecodingman 在他的回答中所建议的,我可以直接比较路径。所以我可以做这样的事情:

match /companies/{companyId} {

allow read: if /databases/$(database)/documents/user/$(request.auth.uid) == resource.data.owner

}

或类似:

match /companies/{companyId} {
  allow read: if isOwner(resource.data.owner, request.auth.uid);
}

function isOwner(owner, userId) {
   return path('/databases/(default)/documents/users/' + userId) == owner;
}

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 2020-06-10
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2020-04-10
    • 2019-03-29
    相关资源
    最近更新 更多