Правила безопасности Firestore - чтение разрешено только для участников Story - PullRequest
0 голосов
/ 25 ноября 2018

В последнее время я много читал о пожарном магазине, но все еще борюсь с одной вещью.

У меня есть документы Story в моем пожарном магазине:

story: {
  name: 'James',
  members: {
    'WeWF34RFD23RF23': 'viewer'
  }
}

свойство members в этом документекарта, в которой ключ равен uid, а значение - роль пользователя.

Я использую AngularFireAuth для аутентификации и AngularFirestore для запроса базы данных.

ПРОБЛЕМА

Когда я запрашиваю документыЯ получаю сообщение об ошибке разрешения, даже если я запрашиваю только документы, у меня есть права на чтение.

  constructor(private db: AngularFirestore, private fAuth: AngularFireAuth) {
    this.collection = db.collection<StoryId>('story', ref => ref.where('name', '==', 'James'));
  }

  ngOnInit() {
    this.stories$ = this.collection.snapshotChanges().pipe( ... )
  }

Может быть несколько историй о Джеймсе, и у каждого из них есть свой uid на карте членов.Есть также истории, которые имеют другое имя и не имеют моего идентификатора на карте участников.По этому запросу я хочу получить все истории о Джеймсе, что приводит к ошибке, но когда я запрашиваю один документ ('story / {story_id}'), все работает нормально.

Вот мои правила безопасности

service cloud.firestore {
  match /databases/{database}/documents {

    match /story/{story} {
      allow read: if request.auth.uid in resource.data.members;
      allow create;

    }
  }
}

Может быть, проблема в том, что когда AngularFirestore запрашивает коллекцию, ей нужны права доступа ко всей коллекции, чтобы возвращать только те значения, к которым я могу получить доступ?Если да, как я могу получить только те документы, к которым у меня есть права доступа?

1 Ответ

0 голосов
/ 29 ноября 2018

Я нашел решение.

Проблема была в том, что если вы запрашиваете только истории с name = James , то firestore проверит, можете ли вы читать (именно это называется список в firestore)все документы, хотя я спрашиваю только о Джеймсе.

Какое решение тогда?

Лучшая идея - сохранить уязвимые данные в подколлекции , как показано ниже

story: {
  name: 'James',
  superPrivateData: {
    ...here goes subcollection
  }
}

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

Надеюсь, это поможет кому-то в будущем!

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