ИСПРАВЛЕНО: Правила безопасности Firestore для подписанных пользователей - PullRequest
0 голосов
/ 11 апреля 2020

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

Моя схема базы данных похожа на this:

У меня есть коллекция статей, в которой каждый документ представляет собой отдельную статью, которая содержит поля, такие как заголовок и фотография. В каждом документе статьи есть подколлекция «Защищенный», в которой содержится содержание статьи, и я хочу, чтобы только подписанные пользователи могли получать эту защищенную информацию.

Мои правила до сих пор:

 match /articles/{articleId} {
    allow read: if true;
            allow write: if request.auth.uid == 'someId';

    match /articles/{articleId}/protected/{protecedId} {
      allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.subscription == true;

    }
  }

Как бы то ни было, это не позволяет моей домашней странице загружаться и показывать какие-либо статьи. Может ли кто-нибудь помочь мне выяснить, что не так с моими правилами?

ОБНОВЛЕНО: Мои правила теперь выглядят так:

 match /articles/{articleId} {
    allow read: if true;
            allow write: if request.auth.uid == 'someid';

     match /protected/{protectedId} {
      allow read: if true;
                allow write;
    }
  }

Однако моя домашняя страница снова не загружается. Единственное решение, кажется, состоит в том, чтобы добавить match / {document = **} к моим правилам. Однако это означает, что все мои другие правила перезаписаны.

ИСПРАВЛЕНО:

Мне нужно было написать правила для всех моих коллекций и подколлекций.

1 Ответ

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

Вы не правильно объявляете свою иерархическую структуру данных в своих правилах.

Как объяснено в do c, указанном выше, "при вложении операторов соответствия путь Оператор внутреннего соответствия всегда относительно относительно пути оператора внешнего соответствия ".

Поэтому вам следует удалить первую часть пути /articles/{articleId}/protected/{protectedId} следующим образом:

service cloud.firestore {
    match /databases/{database}/documents {
       match /articles/{articleId} {
          allow read: if true;
          allow write: ....;

          match /protected/{protecedId} {
            allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.subscription == true;
          }
       }
    }
}
...