Правила безопасности Firebase - невозможно получить ресурсы с помощью get () - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь написать правило в консоли безопасности firebase с помощью get (), но все равно не могу получить данные ресурса ... Я хочу, чтобы документы и их подколлекции были доступны для чтения пользователю, если пользовательский uid находится в поле документа , массив или карта.

Структура моей коллекции: /boards/(boardId)/...mch more

Поля в (boardId) документе:

  • имя : "Board name"
  • ownerId: "MYID12345"
  • guestId (массив): ["MYID12345"]
  • guestMap (карта): [MYID12345: true]

Правила безопасности:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {   
    match /boards/{boardId=**} {
      // rules here
    }
  }
}

То, что я пробовал до сих пор:

allow read: if get(/databases/$(database)/documents/boards/$(boardId)).data.guestsMap[request.auth.uid] == true;
allow read: if request.auth.uid in get(/databases/$(database)/documents/boards/$(boardId)).data.guestsMap;
allow read: if request.auth.uid in get(/databases/$(database)/documents/boards/$(boardId)).data.guestsMap[true];

allow read: if get(/databases/$(database)/documents/boards/$(boardId)).request.data.guestsId[request.auth.uid];
allow read: if request.auth.uid in get(/databases/$(database)/documents/boards/$(boardId)).data.guestsId;
allow read: if request.auth.uid in get(/databases/$(database)/documents/boards/$(boardId)).request.data.guestsId;

allow read: if get(/databases/$(database)/documents/boards/$(boardId)).data.ownerId == request.auth.uid;
allow read: if get(/databases/$(database)/documents/boards/$(boardId)).data.ownerId == "MYID12345";
allow read: if get(/databases/$(database)/documents/boards/$(boardId)).resource.data.ownerId == request.auth.uid;
allow read: if get(/databases/$(database)/documents/boards/$(boardId)).request.data.ownerId == request.auth.uid;

Ничего из этого не сработало, всегда получая:

ERROR FirebaseError: Missing or insufficient permissions.

allow read: если true, приложение работает нормально. Я придерживаюсь документации, но она не работает для меня ...

@ update

match /boards/{boardId=**} {
  allow read: if resource.data.ownerId == request.auth.uid;
}

Также не могу использовать это так, потому что тогда каждая подколлекция ищет Поле ownerId в его документах, а ownerId или массив списка друзей находятся только в документе форума.

@ update

Я пытался сделать так, но это не помогло:

match /boards/{boardId} {
    allow read, write: if request.auth.uid in resource.data.guestsId  || request.auth.uid == resource.data.ownerId;
    allow create: if exists(/databases/$(database)/documents/users/$(request.auth.uid));

    function passResource() {
        return request.auth.uid in resource.data.guestsId  || request.auth.uid == resource.data.ownerId;
    }

    match /categoryList/{categoryId} {
        allow read, write: if passResource();
    }

    ...
}

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 28 февраля 2020

Хорошо, я нашел рабочее решение:

  match /databases/{database}/documents {  
    match /boards/{boardId} {
      allow read: if request.auth.uid in resource.data.guestsId  || request.auth.uid == resource.data.ownerId;
      allow write: if request.auth.uid == resource.data.ownerId;
      allow create: if exists(/databases/$(database)/documents/users/$(request.auth.uid));

      function isAllowed() {
        return request.auth.uid in get(/databases/$(database)/documents/boards/$(boardId)).data.guestsId || request.auth.uid == get(/databases/$(database)/documents/boards/$(boardId)).data.ownerId;
      }
      match /categoryList/{category} {
        allow read, write: if isAllowed();

        match /taskList/{task} {
            allow read, write: if isAllowed();
        }
      }
      ...
  }

Также забавно, что он не хотел работать так:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {  
    match /boards/{boardId=**} {
      allow read, write: if request.auth.uid in get(/databases/$(database)/documents/boards/$(boardId)).data.guestsId || request.auth.uid == get(/databases/$(database)/documents/boards/$(boardId)).data.ownerId;
      allow create: if exists(/databases/$(database)/documents/users/$(request.auth.uid));
    }
 }

, потому что:

Error: simulator.rules line [5], column [49]. Property guestsId is undefined on object.
...