Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值
Posted
技术标签:
【中文标题】Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值【英文标题】:Firebase query (in Swift) to find specific value within all users of an app 【发布时间】:2017-03-15 01:29:48 【问题描述】:我对 Swift 和 Firebase 比较陌生,我正在寻找一种方法来查询 Firebase 数据库以查找特定值。在我正在开发的应用程序的上下文中,当用户注册时,他必须选择一个用户名,我们想在数据库中验证没有其他用户已经拥有选择的用户名。我的数据库结构如下:
假设我正在应用中注册,我希望我的用户名是“mike”。我希望该应用程序在数据库中的所有“用户名”字段中搜索以检查“mike”是否已被占用,但我的 Firebase 代码不起作用:
let queryRef = FIRDatabase.database().reference().child("users")
queryRef.queryOrdered(byChild: "username")
.queryEqual(toValue: self.username.text)
.observeSingleEvent(of: .value, with: snapshot in
if snapshot.exists()
print(snapshot)
)
“快照输入”之后的所有内容甚至都不会被执行(它会跳过指令集)。现在,在进行实际检查之前,我只是在测试并尝试打印“快照”值,但它永远不会被打印出来。
我将我的数据库规则设置为这样,因为任何尝试查询它的人都需要访问“用户名”键:
"rules":
"users":
"$uid":
"email":
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
,
"username":
".read": true,
".write": "$uid === auth.uid",
对我来说,除了“用户名”键之外,将所有内容保密是很重要的。在这个例子中,为了简单起见,我只有“电子邮件”和“用户名”键,但在我的实际应用中,我有更多(名字、姓氏、出生日期、电话号码等)
在这一点上的任何帮助将不胜感激。 非常感谢
【问题讨论】:
【参考方案1】:我认为这是不可能的。
来自 Firebase 文档:
规则以原子方式应用。这意味着如果该位置或父位置没有授予访问权限的规则,则读取或写入操作将立即失败。即使每个受影响的子路径都可以访问,在父位置读取也会完全失败。
在您的情况下,当您尝试按 username
过滤但父节点 users
没有规则时,您将无法完成过滤,因为 PERMISSION_DENIED 将失败.
您可以访问users/a_valid_uid/username
,因为整个路径都可以访问。
作为一种解决方法,您可以做一个单独的节点,只包含用户名,并让公众可以阅读。
您可以查看有关 Firebase 规则 here 的完整文档。
注意:您可以使用 Firebase 规则模拟器在部署规则之前对其进行测试。
【讨论】:
以上是关于Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值的主要内容,如果未能解决你的问题,请参考以下文章
Firebase queryEqualToValue 在 Swift 2.3 中获取密钥