Javascript 如何在CloudFireStore中设置安全规则,以便登录用户只能阅读他们发布的文档

Javascript 如何在CloudFireStore中设置安全规则,以便登录用户只能阅读他们发布的文档,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我尝试过与文档和其他来源所说的相同的事情。由于某种原因,它不起作用。我所需要做的就是设置它,以便登录用户只能读取他们自己的TODO和费用。到目前为止,我只能让它呈现集合中的所有文档(不管uid如何),或者不呈现任何文档。以下是我目前拥有的安全规则。它将获取并呈现todos集合中的所有文档,但不会从费用集合中获取任何文档。我很困惑 service cloud.firestore { match /databases/{database}/documents { match /todos/{to

我尝试过与文档和其他来源所说的相同的事情。由于某种原因,它不起作用。我所需要做的就是设置它,以便登录用户只能读取他们自己的TODO和费用。到目前为止,我只能让它呈现集合中的所有文档(不管uid如何),或者不呈现任何文档。以下是我目前拥有的安全规则。它将获取并呈现todos集合中的所有文档,但不会从费用集合中获取任何文档。我很困惑

service cloud.firestore {
match /databases/{database}/documents {
  match /todos/{todo} {
    allow read, write: if request.auth.uid != null
  }
  match /users/{userId} {
    allow create
    allow read: if request.auth.uid == userId
    allow write: if request.auth.uid == userId

    match /expenses/{expense} {
      allow read: if request.auth.uid != null
      allow write: if request.auth.uid == userId
      }
    }
  }
}

组件的设置如下所示:

import React from 'react'
import TodoSummary from './TodoSummary'
import { Link } from 'react-router-dom'

const TodosList = ({ todos }) => {
  return (
    <div className="section">
      {todos && todos.map(todo => {
        return (
          <Link to={'/todo/' + todo.id} key={todo.id}>
            <TodoSummary todo={todo} id={todo.id} />
          </Link>
        )
      })}

    </div>
  )
}

export default TodosList
从“React”导入React
从“/TodoSummary”导入TodoSummary
从“react router dom”导入{Link}
const todolist=({todos})=>{
返回(
{todos&&todos.map(todo=>{
返回(
)
})}
)
}
将默认值导出到文档列表

我坚持要求您显示代码的原因是,我怀疑您希望安全规则从查询中筛选出文档。他们不会那样做。安全规则不充当筛选器。从:

在编写查询以检索文档时,请记住安全性 规则不是过滤器,查询是全部或无。为了节省你的时间和精力 资源,云Firestore根据查询的潜力评估查询 结果集,而不是所有字段的实际字段值 文件。如果查询可能返回 客户端没有读取权限,整个请求失败


我解决了。Firebase的文档展示了一些代码示例,这些代码可以表达,因此有一些方法可以设置这些示例,以便您可以只读取和写入自己的数据,但还有更多的深度,正如Doug提到的,您需要在查询中指定。我使用了一个简单的if-else语句来检查auth.uid是否与doc.userId匹配,并为我过滤了该用户的结果。谢谢你,道格,让我走上了正确的道路

请编辑问题以显示未按预期方式返回结果的查询。此外,我对你的说法感到困惑,你说“所有在线设置安全规则的例子都与firebase设置规则的方式相似”。文档中的Firestore示例在我看来都不错。我找到的大多数源代码中的格式都是这样的
{“规则”:{“用户”:{“$uid”:{.write”:“$uid===auth.uid”}}}}}
我不确定是否格式化不正确,或者是否有其他可接受的结构化方式,但当我模仿当前文档中的代码时,它并不能解决问题。例如,在此链接中:规则的格式适用于实时数据库,而不是Firestore。它们是不同的产品,完全不相互影响。他们有不同的文档集来适应不同的格式。我明白了,这就清楚了。我希望这些文档能更深入一点,因为他们对如何完成我试图实现的目标的解释不起作用。安全规则非常灵活,不可能记录适用于每个给定应用程序的所有不同方法。但更好的文档正在编写中。在任何情况下,像编写代码一样,需要一些创造性才能将这些部分组合起来,以完成您想要的任务。这就是呈现TODO或费用的列表组件的映射方式。到目前为止,它正在检查它们是否存在(作为来自父组件的道具传入),如果存在,则呈现集合。因此,我的想法是,我需要修改逻辑,以便它检查每个文档的关联用户ID是否需要与登录用户的ID匹配,并仅呈现这些ID?底线是,任何给定的查询都应该只请求用户实际有权阅读的文档。