Firestore安全规则get()无法正常工作

Anu*_*hav 12 google-cloud-firestore firebase-security-rules

在firestore中,如果用户teamid在文档中提到的那样,我希望用户只访问文档.现在我有一个不同的集合teams,我将用户映射为{ user_id = true }.所以我在Firestore规则中有以下内容

return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)

现在,此规则不起作用,并且未能通过前端向数据库发出任何请求.但当我$(resource.data.teamid)用我的实际teamid值替换如下,

return get(/databases/$(database)/documents/teams/234234jk2jk34j23).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)

......它按预期工作.

现在我的问题是我resource是以错误的方式使用resource,get()还是exists()在Firestore规则中不支持或查询?

编辑 完整规则如下

service cloud.firestore {
  match /databases/{database}/documents {

    function isTeamMember() {
        return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
        // return exists(/databases/$(database)/documents/teams/$(resource.data.teamid));
    }

    match /{document=**} {
        allow read, write: if isTeamMember();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您注意到注释掉的规则,exists()则在这种情况下也不起作用.

Sam*_*ern 1

你有这个match

match /{document=**} {
    allow read, write: if isTeamMember();
}
Run Code Online (Sandbox Code Playgroud)

这将匹配数据库中的任何文档。这意味着当您调用时isTeamMember(),不能保证它resource代表一个team文档。如果您有任何子集合teams并写入这些子集合,那么resource将是子集合文档。