【发布时间】:2021-03-07 09:01:41
【问题描述】:
我正在构建一个社交媒体应用程序,任何人都可以在其中阅读正在发生的事情,但必须登录才能与每个帖子进行交互。我想找到一种方法,让我的所有用户都能够在没有不安全数据库的情况下做到这一点。我几乎完成了开发工作,目前正在尝试清理一些东西。
出于开发目的,我当前的规则设置为 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) 内部 sendAnnouncementDataToDatabase 函数
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
})
我已经阅读了许多文件,并堆叠了问题。以及尝试为每条路径设置规则。同样的结果。
任何想法都会有所帮助。 谢谢。
【问题讨论】:
-
您的安全规则应该允许您的代码需要的数据访问,但拒绝任何其他数据访问。这些规则是非常通用的,所以一般会允许/拒绝。如果您想保护应用程序的数据访问模式,请显示应允许的操作和应拒绝的操作的代码。
-
@FrankvanPuffelen 我明白你在说什么。当用户在应用内时,他们真的无处可查看其他任何人的数据。尽管如此,我还是希望有一种通用的方法来简单地允许每个人都可以正确访问。我会更新我的帖子
-
您的代码不符合 #2 中的规则,这是您共享的最安全的规则。如果您想控制对特定用户的访问,则需要在该数据的路径中使用该用户的 UID。
-
@FrankvanPuffelen 我想我明白你在说什么。该表简称为公告。所以我必须在我的路径中发布公告,然后是特定的 uid?
标签: swift firebase firebase-realtime-database firebase-authentication firebase-security