Firestore 安全规则:检查 Firestore 文档中的字段值以验证 read/write 操作

Firestore security rules: Check for a field value from a firestore document to validate read/write operations

我想允许 read/write 仅在以下情况下对文档进行操作:

  1. 有一个有效的帐户
  2. 文档的 ID 与帐户的 uid 匹配
  3. 帐户的电子邮件已验证

  1. 帐户在另一个包含 uid 列表及其状态的文档中声明为已批准,如下所示:

我设法写了 3/4 安全规则,但我正在努力写最后一个,如下所示:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  function isVerified(uid) {
  return get(/db-dev/user-status/$(uid)) == "verified"
  }
    match /{document=**} {
      allow read, write: if get(/users/$(request.auth.uid)).data.admin == true;
    }
    match /db-dev/users/verified/{userId} {
    allow read,write: if request.auth != null && request.auth.uid == userId && request.auth.token.email_verified == true && isVerified(request.auth.uid);
    }
  }
}

理想情况下,我想获取该特定 uid 的值并检查它是否经过验证。有人可以帮我修改我的 isVerified 函数吗?

当我删除 isVerified 时它工作正常但是当我包含 isVerified 时我得到一个错误:Error running simulation — The path "/users/XXXXXXXXXXXXXXXXXXXXXXXXXX" is improperly formatted. Paths should start with "/databases/$(database)/documents/"

理想情况下,我想检查 db-dev/user-status 中是否存在值为“已验证”的 uid,并据此进行处理。

数据库结构:

根据用户的要求,此处的文档结构:

内部用户,我有3个文件:

  1. 已验证
  2. 待定
  3. 拒绝

在所有这三个文件中,我都有其 id 是用户 uid 的文档,后面是他们的详细信息:

您收到的错误是由于 Firebase 规则模拟器中存在的问题。有一些 Whosebug 的答案,例如,this where it is said that the issue is within the Simulator itself. It has also been recorded by google in the Issue tracker,您可以遵循。

至于解决方法,您可以尝试在您的应用程序中部署和测试规则。