Firebase Firestore Securitty Rule, основанное на значении атрибута - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь записать правила безопасности в моей базе данных Firestore, чтобы разрешить чтение документов в коллекции со значением status как published.Но он не позволяет читать какой-либо документ для коллекции после публикации правила.

Я следую настройкам разрешений, описанным в официальном документе.https://firebase.google.com/docs/firestore/security/rules-conditions

Но он не работает должным образом.

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

    match /articles/{articleId} {
        allow read: if resource.data.status == 'published';
    }
  }
}

Я использую следующий код React + Redux для запроса документов:

export const getArticles = (limit = 25) => {
  return (dispatch) => {
    dispatch({ type: ARTICLES });

    const db = firebase.firestore();
    const query = db.collection('articles')
                    .orderBy('createdAt', 'desc')
                    .limit(limit);

    query.get()
    .then((snapshot) => {
      const dataArray = [];
      snapshot.forEach(doc => {
        dataArray.push(mergeDocIdAndData(doc.id, doc.data()));
      });
      getArticlesSuccess(dispatch, dataArray)
        .then(() => dispatch(push('/articles')));
    })
    .catch(() => getArticlesFail(dispatch));
  };
}

1 Ответ

0 голосов
/ 25 мая 2018

Вы пропустили один конкретный момент в документе: ваш запрос не выполняется «потому что он не включает в себя те же ограничения, что и ваши правила безопасности» и «правила безопасности не являются фильтрами».См. https://firebase.google.com/docs/firestore/security/rules-query#queries_and_security_rules

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

const query = db.collection('articles').where("status", "==", "published")...
...