搜索Firebase数据库有两个条件

时间:2017-01-19 03:28:11

标签: ios swift firebase firebase-realtime-database

我有以下Firebase结构:

"Group" : {
  "34923493" : {
  "Name" : "Group 1"
  "Password" : "whatever1”,
  "Admin" : {
       joeshmoe : true
       janedoe : true
       }
  etc..... 
  }
}

我想要实现的是允许用户加入群组;通过具有2个文本框的视图控制器:

要求群组ID 和另一个要求输入密码

加入该群组是与Firebase中的内容匹配的groupid和密码。

因此,假设用户输入34923493作为groupid文本框并在密码文本框中输入“whatever”作为密码,则查找将确定用户与两者匹配并且将被允许添加到组中。

我有以下代码:

ref.child("Group").child(groupID.text!).observeSingleEvent(of: .value, with: { (snapshot) in

应该只执行一次连接查询,并且不会在组上保留任何观察者

但这并没有考虑到密码是否正确才能让用户加入群组?

有没有人已经这样做了或者知道我怎么能做到这一点?

1 个答案:

答案 0 :(得分:2)

您无法检入密码值是否正确。但它也无济于事:如果他们能够读取密码,那么你已经失去了安全战。

与NoSQL数据库一样,您应该为要实现的用例建模数据。因此,您可以将数据模型更改为:

"Group" : {
  "34923493" : {
    "admin": {
      "Name" : "Group 1"
      etc..... 
    }
  }
}

现在,您可以使用两个child()调用来查找数据:

ref.child("Group").child(groupID!).child(password!).observeSingleEvent(of:.value...

确保安全访问数据:

{
  "rules": 
    {
      "Group": {
        "$groupid": {
          "$password": {
            ".read": true
          }
        }
      }
    }
}

使用这些规则,只有知道完整路径后才能阅读群组信息:/Group/34923493/admin。您不能简单地将听众附加到/Group(甚至是/Group/34923493)并以此方式窃取信息。