如何安全地允许每个人读取并授权用户使用Firebase实时数据库向应用程序写入



我正在构建一个社交媒体应用程序,任何人都可以在其中阅读正在发生的事情,但必须登录才能与每条帖子互动。我想找到一种方法,让我的所有用户都能做到这一点,而不会有一个不安全的数据库。我几乎完成了开发,目前我正在努力清理一些事情。

出于开发目的,我当前的规则设置为true:

{
"rules": {
".read": true,
".write": true
}
}

我已经尝试了一些规则

1.

{
"rules": {
"$uid": {
".read": true,
".write": "auth.uid == $uid"
}
}
}

它允许每个人阅读,但由于权限原因不允许写入。

2(

{
"rules": {
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid"
}
}
}

由于权限原因,不允许任何人进行读写操作。

3.

{
"rules": {
".read": "auth.uid != null",
".write": "auth.uid != null"
}
}

这很有效,但我后来收到一封电子邮件,告诉我我的数据库不安全。

下面是一个导致拒绝权限错误的示例:

A( 当用户单击"发送新公告"按钮时此函数被调用。

StorageService.sendAnnouncementDataToDatabase(photoUrl: "", announcementComment: announcementComment, ratio: CGFloat(0), onSuccess: {
ProgressHUD.showSuccess("SWEET")
})

B( 内部发送公告数据到数据库功能

let ref = Ref().databaseAnnouncements
let newAnnouncementID = ref.childByAutoId().key ?? ""
let newAnnouncementReference = ref.child(newAnnouncementID)
guard let currentUser = Api.User.CURRENT_USER  else {
return
}

var dict = ["userId" : currentUserId, "photoUrl" : photoUrl]

newAnnouncementReference.setValue(dict, withCompletionBlock: {(error,ref) in
// permission denied occurs here
})

我已经通读了许多文件,并提出了疑问。以及尝试为每条路径设置规则。同样的结果。

任何想法都会有所帮助。非常感谢。

如果这是实际目标

在其中,任何人都可以阅读正在发生的事情,但必须登录与每个后交互

则此规则将执行

{
"rules": {
".read": true,
".write": "auth != null"
}
}

因为它允许任何人读取任何内容,但只有经过身份验证的用户才能写入。

然而,正如弗兰克在评论中提到的那样,这是非常不安全的。我们可能可以对这个解决方案进行一些扩展,但如果不了解整个用例,它可能会远远超出这里发布的完整答案。