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

时间:2018-09-09 00:21:39

标签: firebase google-cloud-firestore firebase-security-rules

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

groups
  group1
    role=guest
  group2
    role=user
  group3
    role=moderator
users
  user1
    group=group1
  user2
    group=group2
items
  item1
  item2

假设我只允许用户读取/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'
            }

    }
}

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

allow read: if getGroup('<userGroupId>') == 'user'

这也有效:

allow read: if getUser(request.auth.uid).group == '<userGroupId>'

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

allow read: if getGroup(getUser(request.auth.uid).group) == 'user'

是否有可能使其工作? 如果没有,还有另一种方法吗?

0 个答案:

没有答案