在 Firebase 存储中,是否可以使用数据库"get"规则?



我正在尝试根据用户数据保护我的Firebase(Google Cloud Storage)文件。在Firestore中,我使用基于获取数据库内容的规则(在用户表中查找UID并匹配一个字段),这很好。我正在尝试在Firebase存储中使用相同的规则,但是在模拟器中我获得了Error: simulator.rules line [12], column [17]. Function not found error: Name: [get].; Error: Invalid argument provided to call. Function: [get], Argument: ["||invalid_argument||"]。我的规则看起来像这样:

  match /b/{bucket}/o {
    function isAuth() {
      return request.auth != null && request.auth.uid != null
    }
    function isAdmin() {
      return isAuth() &&
      "admin" in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles;
    }
    function clientMatch(client) { // expects user's "client" field to be ID of client
      return isAuth() &&
      client == get(/databases/$(database)/documents/users/$(request.auth.uid)).data.client;
    }
    match /P/Clients/{client}/{allPaths=**} {
      allow read, write: if isAdmin() || clientMatch(client);
    }
  }
}

第12行是clientMatch()中的一个开始client == get。我无法判断这些功能是否仅支持Firestore(DB)规则,或者它们是否也应该用于存储。

如果这不起作用,我的选择是什么?人们如何查找firebase存储安全性的用户数据?

您当前无法在存储规则中引用firestore文档。如果您想将其视为存储规则的功能,请提交功能请求。

,请考虑使用云功能存储触发器在上传文件后执行一些其他检查,并在发现该文件无效的情况下删除文件。

现在可以使用跨服务安全规则。您必须在get()exists()函数之前使用firestore.名称空间,如下所示:

function isAdmin() {
  return isAuth() && "admin" in firestore.get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles;
}

请注意,您会像Firestore安全规则一样向阅读操作收取费用。

相关内容

最新更新