【问题标题】:Angular Firestore filter docs based on permissionsAngular Firestore 根据权限过滤文档
【发布时间】:2018-04-29 02:33:45
【问题描述】:

我在查询文档具有不同权限的集合时遇到问题。

是否有办法对集合执行查询以防止对我无法阅读的文档拒绝权限。如果我一次查询一个,我可以实现这一点。我需要查询集合以返回多个文档,而我可能没有权限访问某些文档?我可以保留特定用户有权查询的文档 ID 列表,但我找不到任何有关指定文档数组的文档。

收藏:

Library > { libraryID } > {
   Users:{ uid, uid, uid },
   title: 'Title of library'
}

规则:

match /Library/{libraryID} {
  allow read: if get(/databases/$(database)/documents/Library/$(libraryID)).data.Users[(request.auth.uid)] == true;
}

如果用户 ID 在数据中,则权限受到限制。

这很好用:

this.afs.collection<Library('Library').doc({libraryID}); // Everything works great

但是我需要集合中的多个项目,所以当我尝试类似下面的示例时如果失败,因为我没有对集合中所有文档的权限:

this.afs.collection<Library('Library'); //PERMISSION DENIED

我希望我可以使用查询来解决这个问题,但是因为它正在查看文档,所以它也失败了:

this.afs.collection<Library('Library',ref => ref.where('Users/'+this._uid, '==', 'true')); // PERMISSION DENIED

所以我希望我可以指定我可以访问的文档(这是我需要的)并将它们返回到一个集合中

this.afs.collection<Library('Library').doc([{libraryID},{libraryID2},{libraryID3}])

如果有人知道实现这一点的解决方案,或重构结构以实现这一点,那将是一个巨大的帮助。

【问题讨论】:

  • 您的用户节点究竟如何?它应该是一张地图。
  • 文档中的User字段只是一个以uid为key、值为true的对象。它仅用于保留与库用户关联的列表或用户:{ 'sdfsdf234234234': true, 'oine345jnw3f': true }。当规则看它时,它只是看看它们是否存在

标签: angularjs firebase google-cloud-firestore angularfire5


【解决方案1】:

试试这个规则

match /Library/{libraryID} {
  allow read: if exists(/databases/$(database)/documents/Library/$(libraryID)/Users/$(request.auth.uid));
}

也就是说,如果当前用户 ID 存在于 Users 节点中,则允许读取。

【讨论】:

  • 我试过这个建议,结果一样。问题实际上并不是权限的那一部分。只要我一次只请求一个文档,它就可以正常运行。但是当我需要所有文件时,因为有些被查询拒绝,它们都失败了。我希望我可以执行绕过安全规则的规则操作,例如检查文档中请求无法读取的现有值。在向 Firestore 询问数据之前,我需要将查询用作过滤器。
  • firebase 不建议在集合级别编写规则。您是否有任何其他可能会干扰此规则的规则。
  • 不确定,除了需要身份验证外,我没有任何权限。我想我只是要改变结构。我只是希望他们是查询某些具有与查询匹配的权限的文档的好例子。
猜你喜欢
  • 2012-08-08
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多