Правила Firebase дают РАЗРЕШЕНИЕ на пользователя, пытающегося сохранить избранные предметы - PullRequest
0 голосов
/ 11 апреля 2020

Это моя структура каталогов Firestore:

items \ {document} \ 1 item with date, image etc
users \ {document} \ favoriteItems

При запуске: приложение загружает список элементов.

Это мои старые правила, которые явно не подходят для производства:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Но со старыми правилами я не получаю ошибку. Так должно быть в правилах.

Когда избранный пользователем элемент впервые, пользователь еще не существует в коллекции users. В подкаталоге пользователя есть подстановочный знак document=**:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {    
    match /items/{document} {
      allow read, write: if request.auth.uid != null;
    }    
    match /users/{document=**} {
      allow read, write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}

Но эти правила дают следующее сообщение об ошибке:

Firestore: (21.4.2) [Firestore]: прослушивание запроса ( target = Query (users / vsfcRpgewjNdFfQomf7MohcOMcA3 / FavoritesItems, упорядоченный по name ); limitType = LIMIT_TO_FIRST) не выполнен: Status {code = PERMISSION_DENIED, description = отсутствуют или отсутствуют разрешения., причиной = 10 * 10 * * 10 * 10 * *

Это кажется очевидным, потому что в первый раз document еще не существует. Но также, когда он присутствует, я получаю то же сообщение об ошибке. Каковы надлежащие правила для этого?

1 Ответ

0 голосов
/ 11 апреля 2020

Вы пытаетесь читать из коллекции users/vsfcRpgewjNdFfQomf7MohcOMcA3/favoriteItems, но только для правил, определенных для users/vsfcRpgewjNdFfQomf7MohcOMcA3. Поскольку вы не предоставляете рекурсивный доступ в этих правилах, доступ к вложенным коллекциям запрещен.

Вы можете либо разрешить вложенный доступ с помощью рекурсивного подстановочного знака :

match /users/{document=**} {
  allow read, write: if request.auth.uid == request.resource.data.author_uid
}

Или, в качестве альтернативы, разрешите доступ к указанной c подколлекции:

match /users/{document} {
  allow read, write: if request.auth.uid == request.resource.data.author_uid
  match /favoriteItems/{favorite} {
      allow read, write: if request.auth.uid == request.resource.data.author_uid
  }
}

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

...