我在 Firebase 安全规则方面遇到了一些问题。我希望任何用户在建立帐户后都能够同时使用我的 iOS 应用程序创建一个帐户我希望有两个节点,一个是私有(private)的,一个是公共(public)的。我希望任何人都可以访问 public,包括用户本身,但是创建帐户的用户只能访问私有(private)节点。我尝试了很多东西,但我的工作似乎都不起作用。我想在不知道每个用户的 uid 的情况下通过链接获取所有公共(public)节点值
1- 任何人都可以创建一个帐户 2- 只有用户可以访问自己的私有(private)节点 3- 一个我只能获取用户所有公共(public)节点的链接
谢谢!!!!
例如,我想获取所有用户 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",
},
},
},
},
},
}
这是我的 swift 代码,但每次我尝试创建一个帐户时,它都说权限被拒绝
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
的读取权限。由于没有人拥有该级别的权限,因此读取操作被拒绝。
这在 documentation 中也称为“规则不是过滤器”和以前的questions .
去年 Firebase 添加了对在安全规则中验证查询的支持,因此例如您可以允许也按 ownerUID
类型属性过滤的查询。请参阅 query based rules 上的文档有关更多信息。
但这也不适用于您的用例,因为读取操作总是返回完整节点。这让我们回到安全规则不能用于过滤数据这一事实。
您必须将公共(public)和私有(private)数据分离到两个单独的顶级节点:private
和public
。这是 Firebase 文档建议保留您的 data structure flat 的众多原因之一。 .
另见:
关于swift - 使用 firebase realtime 创建隐藏的用户节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57264393/