Правило безопасности Firestore - как защитить подколлекцию? - PullRequest
0 голосов
/ 09 мая 2020

Я хотел бы спросить, как лучше всего защитить вложенные коллекции Firestore.

Вот моя проблема: у меня есть пользовательская коллекция, в которой есть документ с именем пользователя. У меня также есть коллекция внутри этого документа с некоторой информацией, включая идентификатор пользователя (снова). Есть ли простой способ предоставить доступ к каждому документу, вложенному в подколлекцию пользовательского документа?

Пока что я написал следующее. Я могу получить доступ к первому документу (тот, который называется i6mg ... но не второй, который называется DxDt ...)

  match /users/{user} {
  allow read: if resource.data.userId == request.auth.uid;
  allow write: if false;

    match /wordScores/{doc} {
    allow read : if resource.data.userId == request.auth.uid;
    allow write;
    }

    match /groupScores/{doc} {
    allow read: if resource.data.userId == request.auth.uid;
    allow write;
    }

  }

Дополнительный вопрос: есть ли способ защитить весь документ без включения идентификатора пользователя в каждом документе?

Спасибо

EDIT Спасибо, Дуг за предложение. Я добавил следующий код и, вероятно, столкнулся с некоторыми другими проблемами ...

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
        match /users/{uid}/{document=**} {
          allow read: if uid == request.auth.uid;
          allow write: if uid == request.auth.uid;
        }
  }
}

Похоже, я предоставляю своим пользователям доступ к подколлекции, но не к основной коллекции. Следующий код, например, не дает результатов и перехватывает исключение

await Firestore.instance.collection('users').where('userId', isEqualTo: userId).limit(1).getDocuments();

Есть предложения?

enter image description here

1 Ответ

1 голос
/ 09 мая 2020

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

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid}/{document=**} {
      allow read: if uid == request.auth.uid;
    }
  }
}

Для получения рекурсивного синтаксиса подстановочного знака необходимо использовать правила безопасности версии 2. Обратите внимание, что обычные подстановочные знаки просто становятся переменными, которые вы можете использовать непосредственно в правилах. Вам не нужно лезть в поле документа, как сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...