【问题标题】:Use Firestore rules to limit list fails on array key使用 Firestore 规则限制列表在数组键上失败
【发布时间】:2023-03-28 20:05:01
【问题描述】:

按照https://firebase.google.com/docs/firestore/solutions/role-based-access 中给出的建议,我正在尝试使用 Firestore 规则仅返回当前用户具有某种权限的文档。

但是,当我实施该规则时,我收到了可怕的“[code=permission-denied]:缺少或不足的权限”错误消息,显然什么也没告诉我,我想知道是否有人能发现问题所在。

我的规则:

//Specific project rules - authorised users who appear in the project list
match /documents/{document} {
function isSignedIn() {
    return request.auth.uid != null;
  }

function getUser(rsc) {
    return rsc.data.users[request.auth.uid];
  }

function isOneOfUsers(rsc, array) {
  return isSignedIn() && (getUser(rsc) in array);
}

allow list: if isOneOfUsers(resource, ['user','admin']);

数据将用户信息存储在文档上的一个字段中(在下面的示例中为 12345。该字段是 Object 类型的,它允许我放置一个键(在下面的示例中为用户 ID,76544)和一个值反对它,例如“管理员”。

我的数据:

documents/12345/users{76544:"admin"}

现在,当我登录并尝试获取文档列表时,我希望看到该文档返回,但我收到错误消息。我可以更改函数 getUser 以返回“用户”并且可以正常工作,所以问题出在评估的某个地方

rsc.data.users[request.auth.uid]

我通常会接受我正在尝试一些无法完成的事情,但它几乎是官方文档的直接副本,所以我一定遗漏了一些东西!

提前感谢您的帮助

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    我认为是这样的:LIST 明确不检查它正在提取的每个文档,规则不是过滤器等。

    在编写查询以检索文档时,请记住安全性 规则不是过滤器——查询是全有或全无。为了节省您的时间和 资源,Cloud Firestore 根据其潜力评估查询 结果集而不是您所有的实际字段值 文件。如果查询可能会返回文档 客户端没有读取权限,整个请求失败。

    因此,LIST 将始终返回 /documents/ 的完整列表,除了会阻止它返回所有这些的授权规则之外,您无法在其中写入任何内容。如果这是真的,如果任何恶意行为者获得了身份验证,他们可以下载您所有 /documents/ 的完整列表。

    解决此问题的唯一明智方法是锁定任何使用 LIST(全部拒绝)的尝试,并让您的列表可访问 /documents/ 而不是针对单个用户。这似乎很繁重,但可能是唯一的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多