我需要一个Firestore规则,该规则允许访问文档的users字段中的用户ID:
Document 1:
uid: 13423425,
...,
users: [{uid: 123, email: john@gmail.com}, {uid: 456, email: jill@gmail.com}]
用户123
应该能够访问该字段,但是用户999
将不能访问该文档。如何编写Firestore规则,使我可以检查给定的用户ID是否在users
字段中?我尝试使用IN
运算符,但是在这种情况下它不起作用,因为它是一个映射数组(而不是字符串或数字数组)。本质上,我正在尝试编写这样的规则(使用地图):
function isAllowed(sometableId) {
return request.auth.uid != null
&& request.auth.uid in get(/databases/$(database)/documents/sometable/$(sometableId)).data.users.map(user => user.uid);
}
match /sometable/{sometableId} {
allow create: if request.auth.uid != null;
allow read, write: if isAllowed(sometableId);
}
答案 0 :(得分:2)
您要执行的操作与文档结构无关。规则目前无法提供迭代数组或执行类似地图操作的方法。考虑使用另一个结构,该结构将要过滤的值作为数组值(是的,您将把用户的数据复制到一个新字段中):
Document 1:
uid: 13423425,
...,
users: ...,
fullAccess: ['123', '456']
现在您的规则可以这样写:
match /sometable/{sometableId} {
allow create: if request.auth.uid != null;
allow read, write: if request.auth.uid in resource.data.fullAccess;
}
您还可以使用带有键的uid值的映射以及包含指示读取/写入访问权限的布尔值的嵌套属性来解决此问题。