【问题标题】:Allow users access only to their own data in Firebase database?只允许用户访问他们自己在 Firebase 数据库中的数据?
【发布时间】:2017-10-29 01:38:00
【问题描述】:

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

我必须使用哪些数据库安全规则才能让 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
});

【问题讨论】:

    标签: firebase firebase-realtime-database hierarchical-data database nosql


    【解决方案1】:

    在您当前的结构中,保护每个帖子创建者的数据访问非常容易:

    {
      "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"
          }
        }
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多