Firebase Simulator запрещает чтение - PullRequest
0 голосов
/ 26 июня 2019

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

Правила Firebase

service cloud.firestore {

    function signedIn() {
      return request.auth != null && request.auth.uid != null;
  }

  function isAuthorized(accountId) {
    return signedIn() && exists(/databases/$(database)/documents/accounts/$(accountId)/users/$(request.auth.uid));
  }

  match /databases/{database}/documents {
    match /users/{uid} {
      allow read, write: if signedIn() && uid == request.auth.uid;
    }
    match /users/{uid}/{document=**} {
        allow read, write: if signedIn() && uid == request.auth.uid;
    }
    match /accounts/{accountId} {
      allow read: if isAuthorized(accountId);
    }
    match /accounts/{accountId}/{document=**} {
      allow read, write: if isAuthorized(accountId);
    }
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

База данных записей

Существующие записи в БД

  1. / пользователей / U123
  2. / счета / AXYZ / пользователи / U123

Проблема

Я ожидаю, что пользователь вошел в систему с помощью uid: u123 имеет доступ для чтения к / account / axyz
Однако Simulator просто выдает ошибку Simulated read denied, не давая никаких подсказок (какая строка / правило вызывает сбой / отказ ..)

Вопрос ??

  1. В чем проблема с этими правилами?
  2. Почему симулятор не может объяснить причину?

Любая помощь будет высоко ценится. Спасибо!

Обновление 1

Если я заменю вызов функции isAuthorized(accountId) на тело функции, как показано ниже, то он будет работать отлично.

match /accounts/{accountId} {
  allow read: if signedIn() && exists(/databases/$(database)/documents/accounts/$(accountId)/users/$(request.auth.uid));
}
match /accounts/{accountId}/{document=**} {
  allow read, write: if signedIn() && exists(/databases/$(database)/documents/accounts/$(accountId)/users/$(request.auth.uid));
}

Так что это работает так. Но все еще задаюсь вопросом, почему вызывать функцию не удается.

...