Правила Firestore не работают должным образом ?! (documentId & get ()) - PullRequest
1 голос
/ 06 апреля 2019

Итак, я весь день бился головой о стену, пытаясь откатить назад и отладить правила своего пожарного депо. Я удалил его прямо туда, где находится проблема, которая, надеюсь, облегчит ее объяснение.

Все работает , если , если сделать это с моим правилом:

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

    match /user_partnerships/{partnershipId} {
        allow read: if 0 == 0;
    }
  }
}

Возвращает 2 документа с идентификаторами cLMZw4EqkSLnafGt8wz7 и ky4hxaEqI8BeLFoip2DF , как и ожидалось.

Используя вышеизложенное и возвращая данные, я знаю, что сам запрос не является проблемой, поскольку правило разрешает запрашивать все данные.

Итак, перейдем к вопросу ... если я теперь изменю вышеприведенное на приведенное ниже, оно перестает работать и говорит, что у меня нет разрешения:

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

    match /user_partnerships/{partnershipId} {
        allow read: if exists(/databases/$(database)/documents/user_partnerships/$(partnershipId));
    }
  }
}

Это, безусловно, не имеет смысла, так как текущий документ, обрабатываемый правилом, является тем, к чему он обращается и, очевидно, существует ..

Похоже, с этим параметр {partnershipId} в правиле, то есть documentId, не передается в функцию get () и, по-видимому, вообще не доступен.

Я проверил, могу ли я смоделировать рабочее правило, просто введя идентификаторы, которые, как я знаю, существуют, в функции get (), и это сработало:

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

    match /user_partnerships/{partnershipId} {
        allow read: if exists(/databases/$(database)/documents/user_partnerships/ky4hxaEqI8BeLFoip2DF) || exists(/databases/$(database)/documents/user_partnerships/cLMZw4EqkSLnafGt8wz7);
    }
  }
}

Это работает! Итак, он показывает, что передача переменной partnershipId не работает?

Теперь это не те правила, которые я собираюсь использовать, я собираюсь запросить что-то, используя partnershipId для сбора разрешений ролей, но так как partnershipId даже не кажется доступным, я даже не могу этого начать.

Пожалуйста, помогите? Кажется, я вообще не могу получить доступ к переменной match / user_partnerships / {partnershipId} .

Редактировать: еще один пример того, что это не имеет никакого смысла:

Это работает

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

    match /user_partnerships/{partnershipId} {
        allow read: if resource.data.permissionOwner == request.auth.uid;
    }
  }
}

Но это не так

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

    match /user_partnerships/{partnershipId} {
        allow read: if get(/databases/$(database)/documents/user_partnerships/$(partnershipId)).data.permissionOwner == request.auth.uid;
    }
  }
}
...