Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Angular Firebase:存储房间密码的方法_Angular_Firebase_Angularfire2 - Fatal编程技术网

Angular Firebase:存储房间密码的方法

Angular Firebase:存储房间密码的方法,angular,firebase,angularfire2,Angular,Firebase,Angularfire2,我正在用Firebase和Angular5构建一个web应用程序。我希望能够创建/加入私人房间(受密码保护) 目前我正处于设计数据库的阶段,无法真正了解如何检查用户输入正确的房间密码,而不实际从firebase数据库检索密码(从而使其完全不安全) 我应该为此使用云功能吗。或者可以直接用firebase完成,而我遗漏了什么?一种不需要服务器的方法是将密码嵌入房间的路径中。例如:如果您有一个房间“general”和密码“correcthorsebatterystaple”,那么您可以将其建模为: m

我正在用Firebase和Angular5构建一个web应用程序。我希望能够创建/加入私人房间(受密码保护)

目前我正处于设计数据库的阶段,无法真正了解如何检查用户输入正确的房间密码,而不实际从firebase数据库检索密码(从而使其完全不安全)


我应该为此使用云功能吗。或者可以直接用firebase完成,而我遗漏了什么?

一种不需要服务器的方法是将密码嵌入房间的路径中。例如:如果您有一个房间“general”和密码“correcthorsebatterystaple”,那么您可以将其建模为:

messages
    general_correcthorsebatterystaple
roomnames
    general
并通过以下方式确保其安全:

{
  rules: {
    messages: {
      "$roomid": {
        ".read": true
      }
    "roomnames: {
      ".read": true
    }
  }
}

根据这些规则,任何人都可以阅读房间名称列表。但是,如果您还知道房间名称的密码,则只能阅读房间的信息。

您可以在firebase中执行此操作

假设DB的一部分布局如下:

/chatRooms/$roomID/password=$password

聊天室所有者被授予对
/chatRooms/$roomID/password
的读/写权限

要成为聊天室成员,您必须将文档添加到:
聊天室/$roomId/users/$userId
具有以下验证:

条目的userId必须是当前用户,密码字段必须等于密码。验证规则可以访问数据库中的任何数据,即使用户无法访问数据

下面是一个(未经测试的)示例,将展示基本原则

简言之:

  • 只有聊天室管理员可以设置密码。没有人可以读它
  • 如果用户的uid在members集合中,则可以读取聊天数据
  • 若要将成员添加到集合中,他们必须写入一个密码,该密码等于(当时)房间密码
  • 代码:


    这听起来是一个合理的解决方案。但是,请您对此做进一步解释:“条目的userId必须是当前用户,password字段必须等于password。验证规则可以访问数据库中的任何数据,即使用户无法访问数据。”当用户访问时,我应该写密码吗?聊天室/$roomId/users/$userId我是firebase规则的新手。>密码字段必须等于密码。密码字段必须等于哪个密码?我们如何在不将其写入数据库的情况下提供它?@danilandreyevichbaunov文档在这里解释。如果你读了,你会明白的。用户必须尝试将自己写入
    /users
    集合。如果他们成功了,他们一定知道密码。我已经看过文件了。仍然不知道用户是如何知道密码的。我们如何检查它?我们在聊天室/$roomId/用户位置上实际写了什么?只是用户ID?@Danilandreyevichbaunov它已经更新了。现在有意义了吗?
    "chatrooms" : {      
      "$room_id" : {
        "chat data" : {
          ".read" : "root.child('/chattrooms/' + $room_id + '/members/' + auth.uid).exists()"
        }, 
        "password": {
          ".read": "false",
          ".write": "root.child('/chattrooms/' + $room_id).child('admin').val() == auth.uid"
        }, 
        "members" : {
          "$user_id" : {
            ".validate": "$user_id == auth.uid && newData.val() == root.child('/chattrooms/' + $room_id + '/password').val()"
          }
        }
      }
    }