Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
允许用户仅访问Firebase数据库中自己的数据?_Firebase_Firebase Realtime Database_Hierarchical Data_Database_Nosql - Fatal编程技术网

允许用户仅访问Firebase数据库中自己的数据?

允许用户仅访问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",

我试图建立这样的数据结构,并确保用户只能提取自己的数据,因为所有的处理都是在客户端完成的

我必须使用什么数据库安全规则,以便User1可以访问自己的帖子,但不能访问User2的帖子

(我正在使用Firebase web)

示例数据库结构:

{
  "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"
      }
    }
  }
}
每个用户都可以阅读并列出自己的帖子。但是一定要记住第二个索引,因为你迟早会需要它的