在用户有权在firebase中阅读的文档中进行搜索
我有一套文件。每个文档都有子在用户有权在firebase中阅读的文档中进行搜索,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我有一套文件。每个文档都有子uid,它是对所有者的引用。示范文件: { "uid": "slfjs092320i3jf023jf", "content": "Example" } 我想将它们存储在/documents集合下,并且只允许具有匹配uid的用户存储和检索它们。我创建了以下规则: { "rules": { "documents": { "$documentId": { ".read": "data.child('uid').val() =
uid
,它是对所有者的引用。示范文件:
{
"uid": "slfjs092320i3jf023jf",
"content": "Example"
}
我想将它们存储在/documents
集合下,并且只允许具有匹配uid的用户存储和检索它们。我创建了以下规则:
{
"rules": {
"documents": {
"$documentId": {
".read": "data.child('uid').val() === auth.uid",
".write": "newData.exists() && newData.child('uid').val() === auth.uid || data.exists() && data.child('uid').val() === auth.uid",
".indexOn": ["uid"]
}
}
}
}
不幸的是,当我想要检索用户的文档时,我收到的权限被拒绝。要检索我使用的文档,请执行以下操作:
export default getUserDocuments = () => {
const userUid = firebase.auth().currentUser.uid;
return firebase.database()
.ref('/documents')
.orderByChild('uid')
.equalTo(userUid)
.once('value');
};
如何查询用户的文档?我猜被拒绝的权限与执行查询所需的读取限制有关。附加侦听器时,Firebase数据库强制执行读取权限。要能够阅读
/文档
,您需要拥有对/文档
的阅读权限。由于您的安全规则并非如此,侦听器将被拒绝
这在一开始可能是违反直觉的,这意味着安全规则不能用于以您尝试的方式过滤数据。这在文档中称为,并且一直是本文的主题。我建议您查看其中一些,如果您有更多问题,请反馈。查看
正如Frank所说,规则不是过滤器,他是对的,但你可以通过一些查询来实现类似于你所期望的这类东西:
baskets": {
".read": "auth.uid != null &&
query.orderByChild == 'owner' &&
query.equalTo == auth.uid" // restrict basket access to owner of basket
}
然后,这将起作用:
db.ref("baskets").orderByChild("owner")
.equalTo(auth.currentUser.uid)
.on("value", cb)
而这不会:
db.ref("baskets").on("value", cb)
谢谢你的回复。存储这些数据的好方法是什么?假设我的文档也有类别。我应该创建两个集合吗?一个名为
usersDocuments
,结构为{$uid:{content:{example}},第二个名为documentsWithCategories
,结构为{$category:{document1tId:true,document2Id:true}?通常,对于当前结构无法满足的每个用例,您都会得到一个顶级列表。这些列表可以是完全/部分重复的,也可以只是手动索引(如在您的注释中)。