从一组地图中的地图中提取字段

时间:2020-08-03 14:58:55

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

我需要一个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);
}

1 个答案:

答案 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值的映射以及包含指示读取/写入访问权限的布尔值的嵌套属性来解决此问题。