我尝试了文档和其他来源说的相同的事情。由于某种原因,它不起作用。我需要做的就是设置它,以便登录的用户只能读取自己的待办事项和费用。到目前为止,我只能从集合中呈现所有文档(无论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
答案 0 :(得分:0)
之所以坚持要求您显示代码,是因为我怀疑您期望安全性规则从查询中过滤掉文档。他们不会那样做。安全规则不充当过滤器。来自documentation:
在编写查询以检索文档时,请记住安全性 规则不是过滤器-查询全部或全部。为了节省您的时间, 资源,Cloud Firestore根据潜在查询评估查询 结果集,而不是所有您的实际字段值 文件。如果查询可能返回文档, 客户端没有读取权限,整个请求失败。
答案 1 :(得分:0)
我解决了。 Firebase的文档展示了一些示例代码,这些示例表达了可以设置它们的方式,以便您只能读写自己的数据,但我对此深感兴趣,正如Doug所述,您需要在查询。我使用了一个简单的if else语句来检查auth.uid是否与doc.userId相匹配,并为我过滤了该用户的结果。谢谢道格,让我走上了正确的道路!