允许用户仅访问Firebase数据库中自己的数据?
我试图建立这样的数据结构,并确保用户只能提取自己的数据,因为所有的处理都是在客户端完成的 我必须使用什么数据库安全规则,以便User1可以访问自己的帖子,但不能访问User2的帖子 (我正在使用Firebase web) 示例数据库结构:允许用户仅访问Firebase数据库中自己的数据?,firebase,firebase-realtime-database,hierarchical-data,database,nosql,Firebase,Firebase Realtime Database,Hierarchical Data,Database,Nosql,我试图建立这样的数据结构,并确保用户只能提取自己的数据,因为所有的处理都是在客户端完成的 我必须使用什么数据库安全规则,以便User1可以访问自己的帖子,但不能访问User2的帖子 (我正在使用Firebase web) 示例数据库结构: { "posts" : { "001" : { "text" : "note 1", "userID" : "User1" }, "002" : { "text" : "note 2",
{
"posts" : {
"001" : {
"text" : "note 1",
"userID" : "User1"
},
"002" : {
"text" : "note 2",
"userID" : "User1"
},
"003" : {
"text" : "note 3",
"userID" : "User2"
}
}
}
firebase.database().ref('/posts/').once('value').then(function(snapshot) {
console.log(snapshot.val()); // Returns all 3 posts
});
示例数据库查询:
{
"posts" : {
"001" : {
"text" : "note 1",
"userID" : "User1"
},
"002" : {
"text" : "note 2",
"userID" : "User1"
},
"003" : {
"text" : "note 3",
"userID" : "User2"
}
}
}
firebase.database().ref('/posts/').once('value').then(function(snapshot) {
console.log(snapshot.val()); // Returns all 3 posts
});
在您当前的结构中,很容易保护对每个帖子创建者的数据访问:
{
"rules": {
"posts": {
"$postid": {
".read": "data.child('userID').val() === auth.uid"
}
}
}
}
这就是所需要的:现在每个用户只能阅读自己的帖子
但这种方法有一个大问题:现在没有人可以阅读/posts
,因此没有人可以获得所有posts的列表
要授予某人列出帖子的能力,您必须授予他们对/posts
的读取权限。因为你不能撤销一个较低级别的权限,这意味着你在那一点上,他们可以阅读所有的帖子,而不仅仅是他们创建的帖子
这在Firebase中称为:不能使用规则筛选数据。我们在这里已经讨论了很多关于堆栈溢出的内容,所以我建议您也查看一些
这个问题有很多解决办法
二级索引
一个常见的解决方案是创建每个用户都有权访问的post ID列表。这通常称为(辅助)索引,并将此附加数据添加到模型中:
{
"userPosts" : {
"User1": {
"001" : true,
"002" : true
},
"User2": {
"003" : true
}
}
}
现在,您可以像以前一样保护对原始帖子的访问,但随后可以通过以下方式保护对辅助索引的访问:
{
"rules": {
"userPosts": {
"$userid": {
".read": "$userid === auth.uid"
}
}
}
}
因此,每个用户都可以阅读他们有权访问的帖子列表,然后可以在/posts/postd
下阅读每个帖子
将每个用户的帖子存储在单独的节点下
在您的情况下,有一个更简单的解决方案。我会对数据进行更层次化的建模,每个用户的帖子都在自己的UID下:
{
"posts" : {
"User1": {
"001" : {
"text" : "note 1",
"userID" : "User1"
},
"002" : {
"text" : "note 2",
"userID" : "User1"
},
},
"User2": {
"003" : {
"text" : "note 3",
"userID" : "User2"
}
}
}
}
现在,您可以通过以下方式确保访问安全:
{
"rules": {
"posts": {
"$userid": {
".read": "$userid === auth.uid"
}
}
}
}
每个用户都可以阅读并列出自己的帖子。但是一定要记住第二个索引,因为你迟早会需要它的