如何使用嵌套的 get() 调用创建 Firestore 安全规则?

Den*_*nko 7 firebase firebase-security google-cloud-firestore

我有以下 firestore 数据库(简化版)

groups
  group1
    role=guest
  group2
    role=user
  group3
    role=moderator
users
  user1
    group=group1
  user2
    group=group2
items
  item1
  item2
Run Code Online (Sandbox Code Playgroud)

假设我只想允许用户读取/items数据。这是我的方法:

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

            function getUser(id) {
                return get(/databases/$(database)/documents/users/$(id)).data
            }

            function getGroup(id) {
                return get(/databases/$(database)/documents/groups/$(id)).data
            }

            function getRole(id) {
                return get(/databases/$(database)/documents/roles/$(id)).data
            }

            match /items/{document=**} {
                allow read: if getRole(getGroup(getUser(request.auth.id).group).role) == 'user'
            }

    }
}
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用。看起来不可能在 Firestore 规则中进行嵌套调用。我getGroup()用硬编码的 id进行了测试,它工作正常:

allow read: if getGroup('<userGroupId>') == 'user'
Run Code Online (Sandbox Code Playgroud)

这也有效:

allow read: if getUser(request.auth.uid).group == '<userGroupId>'
Run Code Online (Sandbox Code Playgroud)

但它在这个更复杂的规则上失败了:

allow read: if getGroup(getUser(request.auth.uid).group) == 'user'
Run Code Online (Sandbox Code Playgroud)

有没有可能让它发挥作用?如果没有,还有其他方法可以做到这一点吗?