首页 > 解决方案 > 将 Firestore 安全规则移至自定义函数会破坏规则

问题描述

我有一个 Firestore 安全规则,用于检查用户是否具有访问另一个文档的正确代码。

service cloud.firestore {
  match /databases/{database}/documents {
    match /Orgs/{orgID} {
      allow read: if get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.OrgCode == resource.data.Code;
    }
  }
}

这很好用。但是,如果我尝试将此检查移动到自定义函数中,如下所示:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Orgs/{orgID} {
      allow read: if isPartOfOrg();
    }
  }
}
function isPartOfOrg(){
  return get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.OrgCode == resource.data.Code;
}

然后我开始收到权限错误。除了将逻辑移入函数之外,我什么都没做,为什么这不起作用?

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


我在写问题时想通了。文档说函数可以从定义它们的范围访问变量和函数,不是从它们被调用的地方访问。

因此,将函数移动到匹配块中,一切都会再次运行!

service cloud.firestore {
  match /databases/{database}/documents {
    match /Orgs/{orgID} {
      function isPartOfOrg(){
        return get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.OrgCode == resource.data.Code;
      }
      allow read: if isPartOfOrg();
    }
  }
}

希望这可以帮助遇到此问题的其他人!


推荐阅读