Запрос Firebase, правило для запроса группы сбора мешает - PullRequest
0 голосов
/ 03 августа 2020

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

У меня есть это правило запроса:

// Needed for collection group (Member) query
// https://firebase.googleblog.com/2019/06/understanding-collection-group-queries.html
match /{rootPath=**}/Members/{member} {
    allow read: if request.auth != null;
}

Это довольно просто c требуется только авторизованный пользователь. запрос группы сбора работает идеально, как ожидалось.

Теперь я хочу иметь еще один запрос только для получения документов участников:

Firebase.firestore.collection("Companies\\$companyID\\Members").get().await()

Запрос возвращает ошибку ( PERMISSION_DENIED).

Я также пробовал добавить правило только для таких членов:

match /Companies/{companyID} {
    allow read: if request.auth != null &&
                isMember(database, companyID, request.auth.uid)
      
    match /Members/{member} {
        allow read: if request.auth != null 
    }
}

Тем не менее, та же ошибка.

Это путь к документу:

document path

I looked at a few resources, but I didn't see anything to suggest a solution:

Общие сведения о запросах группы сбора в Cloud Firestore

Рекурсивные подстановочные знаки

Ответы [ 3 ]

0 голосов
/ 27 августа 2020

Я отправляю это как ответ, так как он слишком длинный для комментариев.

Пробовали ли вы следующий пример правила:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Companies/{companyID}/Members/{member} {
      allow read, write: if <condition>;
    }
  }
}

как упоминалось ранее в документация, которой вы поделились на основе правил структурирования с иерархическими данными?

0 голосов
/ 02 сентября 2020

Я бы порекомендовал вам взглянуть на следующую документацию , где вы можете найти несколько примеров:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Companies/{companyID}/Members/{memberID} {
      // Only authenticated users can read
      allow read: if request.auth != null;
    }
  }
}

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

db.collection("Companies/{companyID}/Members").get()

Теперь, если вы хотите, чтобы те же правила безопасности применялись к запросам группы сбора, вы должны использовать версию 2 :

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {
    // Authenticated users can query the posts collection group
    // Applies to collection queries, collection group queries, and
    // single document retrievals
    match /{path=**}/Members/{memberID} {
      allow read: if request.auth != null;
    }
  }
}

Любой аутентифицированный пользователь может получить члены любой отдельной компании :

Но что, если вы хотите показать определенному пользователю его членов во всех компаниях? Вы можете использовать запрос группы сбора для получения результатов из всех коллекций элементов:

  var user = firebase.auth().currentUser;
    
  db.collectionGroup("members").where("author", "==", user.uid).get()

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

0 голосов
/ 03 августа 2020

Вы можете попробовать использовать "match / {path = **} / Members / {member}" вместо rootPath. Вторым я не пользовался, но первый работал у меня в других проектах.

...