【发布时间】:2021-12-26 17:41:03
【问题描述】:
我有一个带有集合users 的firestore 数据库,其中包含有关我的用户的信息。每个文档的 id 是 Firebase Auth 分配的用户 uid。
我有另一个名为 rooms 的集合,其中包含一个字段 users,它是文档引用列表,这些引用指向用户文档。
这是一个房间文档,其中有一个字段是对用户集合的引用列表。 /users/后面看到的字母是用户的uid,也是集合users中用户的文档id。
我还有一个名为owner 的字段,它是对集合users 中user 的文档引用。
我想创建一个 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