Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于属性值的Firebase Firestore安全规则_Javascript_Firebase_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Javascript 基于属性值的Firebase Firestore安全规则

Javascript 基于属性值的Firebase Firestore安全规则,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我正在尝试在Firestore数据库上编写安全规则,以允许读取状态为值为已发布的集合中的文档。但是,一旦规则发布,它就不允许读取集合的任何文档 我遵循官方文档中描述的权限设置。 但是,它并没有像预期的那样发挥作用 service cloud.firestore { match /databases/{database}/documents { match /articles/{articleId} { allow read: if resource.data.st

我正在尝试在Firestore数据库上编写安全规则,以允许读取
状态为
值为
已发布
的集合中的文档。但是,一旦规则发布,它就不允许读取集合的任何文档

我遵循官方文档中描述的权限设置。

但是,它并没有像预期的那样发挥作用

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));
  };
}

您错过了文档中的一个特定点:您的查询失败“因为它没有包含与您的安全规则相同的约束”和“安全规则不是过滤器”。看

换句话说,您的查询应该如下所示:

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

您错过了文档中的一个特定点:您的查询失败“因为它没有包含与您的安全规则相同的约束”和“安全规则不是过滤器”。看

换句话说,您的查询应该如下所示:

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

您用来阅读文档的代码是什么?我使用的是React+Redux。以下要点包含读取数据的方法@ShouvikMukherjee您能在您的问题中包含相关代码吗?目前,被接受的答案和你的问题似乎完全无关。@AndréKool说得好。Shouvik Mukherjee,我在上面链接的要点中添加了用于查询的代码。您用于阅读文档的代码是什么?我使用的是React+Redux。以下要点包含读取数据的方法@ShouvikMukherjee您能在您的问题中包含相关代码吗?目前,被接受的答案和你的问题似乎完全无关。@AndréKool说得好。Shouvik Mukherjee,我添加了用于查询的代码,来自上面链接的要点。哦,好的。我错过了。非常感谢您指出这一点~干杯它们还提供了以下规则
允许读取:if resource.data.published==true | | request.auth.uid==resource.data.author
。当我执行
firebase.firestore().collection('test').where('published','=',true.get()时
我只在
published==true
的地方获取文档,这是预期的还是应该从登录用户那里获取文档,在
published==false
的地方获取文档,这是我想要的,但我在结果集中没有看到它们。@Guus这是预期的。独立于使用
筛选的安全规则,其中('published','=',true)
。如果您想要所有您是作者但尚未发布的文档,则需要构建另一个查询并合并这两个结果。(不可能做OR)哦,好的。我错过了。非常感谢您指出这一点~干杯它们还提供了以下规则
允许读取:if resource.data.published==true | | request.auth.uid==resource.data.author
。当我执行
firebase.firestore().collection('test').where('published','=',true.get()时
我只在
published==true
的地方获取文档,这是预期的还是应该从登录用户那里获取文档,在
published==false
的地方获取文档,这是我想要的,但我在结果集中没有看到它们。@Guus这是预期的。独立于使用
筛选的安全规则,其中('published','=',true)
。如果您想要所有您是作者但尚未发布的文档,则需要构建另一个查询并合并这两个结果。(不可能执行OR)