gpt4 book ai didi

firebase - 允许用户只访问他们自己在 Firebase 数据库中的数据?

转载 作者:太空狗 更新时间:2023-10-30 01:54:52 24 4
gpt4 key购买 nike

我正在尝试拥有这样的数据结构,并确保用户只能提取他们自己的数据,因为所有处理都是在客户端完成的。

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

(我正在使用 Firebase 网络)

示例数据库结构:

{
"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 的读取权限。由于您无法撤销较低级别的权限,这意味着您此时他们可以阅读所有帖子,而不仅仅是他们创建的帖子。

这在 Firebase 中称为 rules are not filters : 您不能使用规则来过滤数据。我们在 Stack Overflow 上对此进行了相当多的介绍,因此我建议您也查看一些 other questions on the topic .

这个问题有很多解决方案。

二级索引

一个常见的解决方案是创建每个用户都可以访问的帖子 ID 列表。这通常称为(二级)索引,并将此附加数据添加到您的模型中:

{
"userPosts" : {
"User1": {
"001" : true,
"002" : true
},
"User2": {
"003" : true
}
}
}

现在您可以像以前一样保护对原始帖子的访问,但随后通过以下方式保护对二级索引的访问:

{
"rules": {
"userPosts": {
"$userid": {
".read": "$userid === auth.uid"
}
}
}
}

因此每个用户都可以阅读他们有权访问的 postID 列表,然后可以阅读 /posts/postID 下的每个帖子。

将每个用户的帖子存储在一个单独的节点下

对于您的情况,有一个更简单的解决方案。我会为数据建模稍微分层一些,每个用户的帖子都在他们自己的 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"
}
}
}
}

每个用户都可以阅读和列出自己的帖子。但请牢记二级索引,因为您迟早可能需要它。

关于firebase - 允许用户只访问他们自己在 Firebase 数据库中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com