Firestore:查询用户有权访问的所有文档的集合

Mat*_*ske 9 firebase google-cloud-firestore

遇到我不清楚的情况有一个干净的解决方案。

在 Firestore 中,我有一个仅允许用户访问某些文档的集合。用户可以被分配到一个或多个帐户,并且帐户可以有一个或多个用户。一般模型和规则按预期工作:

USER: {
  id       : abc123,
  accounts : [ xyz789, ... ]
}

ACCOUNT: {
  id      : xyz789,
  users   : [ abc123, ... ]
}

service cloud.firestore {
  match /databases/{database}/documents {
    match /accounts/{accountID} {
      allow read, write: if accountID in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.accounts;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

根据我使用 Firebase 规则模拟器的判断,上述规则工作正常(我可以读取/更新列出我的用户 ID 的帐户,但不能读取/更新没有的帐户)。

问题是,如果我想通过 Query 运算符获取相同的帐户,则会出现错误。当我放松规则集时,错误确实消失了,但这并不理想。

firestore.collection('accounts').where('users', 'array-contains', userID)

ERROR: Missing or insufficient permissions
Run Code Online (Sandbox Code Playgroud)

鉴于规则集和查询似乎引用了相同的记录,有没有办法让它们一起工作,或者我是否被迫放松规则以使其工作?

Dig*_*iro 1

我之前也遇到过类似的问题,我发现Firebase不会检查获取的数据来验证规则,而是将查询代码规则进行比较,并根据情况抛出异常

所以我发现条件应该在代码中if有一个过滤器where

if条件缺少一个where

allow read, write: if accountID in ...
Run Code Online (Sandbox Code Playgroud)

为了使您的代码正常工作,需要添加一个where引用的过滤器accountID

firestore().collection('accounts')
    .where(firestore.FieldPath.documentId(), 'in', accounts) //accounts: ['xyz789']
    .where('users', 'array-contains', userID)
Run Code Online (Sandbox Code Playgroud)