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

时间:2019-02-01 04:36:50

标签: javascript firebase google-cloud-firestore firebase-security-rules

我尝试了文档和其他来源说的相同的事情。由于某种原因,它不起作用。我需要做的就是设置它,以便登录的用户只能读取自己的待办事项和费用。到目前为止,我只能从集合中呈现所有文档(无论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

2 个答案:

答案 0 :(得分:0)

之所以坚持要求您显示代码,是因为我怀疑您期望安全性规则从查询中过滤掉文档。他们不会那样做。安全规则不充当过滤器。来自documentation

  

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

答案 1 :(得分:0)

我解决了。 Firebase的文档展示了一些示例代码,这些示例表达了可以设置它们的方式,以便您只能读写自己的数据,但我对此深感兴趣,正如Doug所述,您需要在查询。我使用了一个简单的if else语句来检查auth.uid是否与doc.userId相匹配,并为我过滤了该用户的结果。谢谢道格,让我走上了正确的道路!