Как создать правило безопасности firestore с помощью вложенных вызовов get ()? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть следующая база данных пожарного магазина (упрощенно)

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'
            }

    }
}

Но, похоже, это не работает. Похоже, что нельзя делать вложенные вызовы в правилах пожарного депо. Я протестировал 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'

Можно ли заставить его работать? Есть ли другой способ сделать это, если нет?

...