swift - 使用firebase实时创建隐藏用户节点
问题描述
我在使用 Firebase 安全规则时遇到了一些问题。我希望任何用户都能够在他或她建立帐户后同时使用我的 iOS 应用程序创建一个帐户,我希望有两个节点,一个是私有的,一个是公共的。我希望任何人都可以访问公众,包括用户自己,但创建帐户的用户只能访问私有节点。我已经尝试了很多东西,但我的工作似乎都没有奏效。我想通过仅具有链接而不知道每个用户的 uid 来获取所有公共节点值
1- 任何人都可以创建一个帐户 2- 只有用户可以访问他自己的私有节点 3- 一个链接,我只能获取用户的所有公共节点
谢谢!!!!
例如,我想获取所有用户https://id.firebaseio.com/Ireland.json
这是我的一些工作
{
"rules": {
"Ireland": {
"users": {
"$uid": {
"private": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid",
},
"public": {
".read": true,
".write": "auth != null && auth.uid == $uid",
},
},
},
},
},
}
这是我的快速代码,但每次我尝试创建一个帐户时,它都会说权限被拒绝
guard let uid = result?.user.uid else { return }
let privateValues = ["email": email, "username": username, "password": password, "profileImageUrl": profileImageUrl, "country": "Ireland"]
let publicValues = ["username": username, "profileImageUrl": profileImageUrl]
let values = [uid: ["private": privateValues, "public": publicValues]]
Database.database().reference().child("Ireland").child("users").updateChildValues(values, withCompletionBlock: { (error, reference) in
if let error = error {
print("Failed to save user info to database: ", error)
self.signUpButton.wiggle()
return
}
解决方案
Firebase 安全规则不能用于过滤数据。他们所做的只是检查是否允许某个读取操作,而不检查每个单独的节点。
因此,如果您将侦听器附加到/Ireland
,服务器会检查当前用户是否具有对 的读取权限/Ireland
。由于没有人拥有该级别的权限,因此读取操作被拒绝。
去年 Firebase 添加了对验证安全规则中的查询的支持,例如,您可以允许查询也按ownerUID
类型属性进行过滤。有关更多信息,请参阅有关基于查询的规则的文档。
但这也不适用于您的用例,因为读取操作总是返回完整节点。这让我们回到了安全规则不能用于过滤数据的事实。
您必须将公共和私有数据分成两个单独的顶级节点:private
和public
. 这是 Firebase 文档建议保持数据结构平坦的众多原因之一。
另见:
推荐阅读
- python-3.x - VS 代码 pylint 错误和格式不起作用
- javascript - 静音和取消静音按钮
- windows - 如何为指向特定 firebird 数据库存档的应用程序创建快捷方式?
- django-rest-framework - ListCreateAPIView Django 休息框架方法 \"POST\" 不允许
- python - 如何根据两列的最大值拆分数组
- javascript - 从渲染器迁移到渲染器2
- linux - 如何阻止“是”命令重复其他命令?
- c# - Microsoft Azure 中托管的 .NET CORE API 应用程序超时异常(Redis 缓存、SQL、.NET Core)
- apache-spark - Simba Spark JDBC 驱动程序 - DatabaseMetaData.getColumns() 不起作用
- python - 熊猫数据帧中时间戳之间的时间差作为直方图