Не удается получить правила безопасности для каскадирования в подколлекции + разрешить создание не работает - PullRequest
0 голосов
/ 19 октября 2019

У меня есть следующие проблемы с моими правилами безопасности:

У меня есть классные комнаты для сбора, а внутри есть классные документы. Сначала, когда я проверяю if classroo.owner == request.auth.uid, он всегда возвращает false, чтобы разрешить создание / обновление / удаление, но когда я делаю это с if request.auth.uid in classroomData().userList, он прекрасно работает, чтобы разрешить чтение.

Я пытался использовать эти правила безопасности, также обратите внимание нате, которые закомментированы -

service cloud.firestore {
  match /databases/{database}/documents {
    function isSignedIn() {
      return request.auth != null;
    }
    match /classrooms/{classroom} {
        allow read: if request.auth.uid in classroomData().userList;
        allow update, delete,create: if classroomData().owner == request.auth.uid;

        function classroomData() {
            return get(/databases/$(database)/documents/classrooms/$(classroom)).data
        }



        // match /classrooms/{classroom}/tasks/{taskId} {
        //     allow read: if request.auth.uid in classroomData().userList;
        //     allow update, delete,create: if parentDoc().owner == request.auth.uid;
        //  }
    }
  }
}

и коллекции -

https://i.stack.imgur.com/Bjh9W.png

В некоторых классах есть вспомогательная коллекция задач с документами, связанными с задачами, и я хочу, чтобы пользователине иметь возможности читать задачи / классную комнату, если они не являются частью родительской classroom.userList, и не может удалять / писать / обновлять, если они не являются владельцем. Теперь моя проблема в том, что я не могу заставить свои правила безопасности работать ...

1 Ответ

0 голосов
/ 19 октября 2019

То, что у вас есть в поле владельца документа класса, выглядит как адрес электронной почты, а не как UID аутентификации Firebase. Это никогда не сравнится с request.auth.uid. Похоже, что документ имеет UID в поле uid. Вероятно, вы должны использовать это для своих правил безопасности, а не для адреса электронной почты.

allow update, delete, create: if classroomData().uid == request.auth.uid;

Но так как вы сравниваете UID с текущим документом, который соответствует правилам безопасности, вам не нужно получать() этот документ. Вы можете получить доступ к свойствам текущего документа, используя: resource:

allow update, delete, create: if resource.data.uid == request.auth.uid;

Вы можете упростить еще больше. Поскольку доступ write совпадает с комбинацией update, delete и create, вы можете написать правило следующим образом:

allow write: if resource.data.uid == request.auth.uid;
...