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;
}
}
}

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

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

firestore.collection('accounts').where('users', 'array-contains', userID)
ERROR: Missing or insufficient permissions

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

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

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

if条件缺少where

allow read, write: if accountID in ...

若要使代码正常工作,需要添加引用accountIDwhere筛选器

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

相关内容

  • 没有找到相关文章