我有以下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
应该只执行一次连接查询,并且不会在组上保留任何观察者
但这并没有考虑到密码是否正确才能让用户加入群组?
有没有人已经这样做了或者知道我怎么能做到这一点?
答案 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
)并以此方式窃取信息。