Firebase 安全规则,在不同位置进行读写



我的实时数据库模式是这样设计的。

"roles" : {
"uid-1" : "user",
"uid-2" : "moderator",
"uid-3" : "user" // ... and so on
}
"photos" : {
"uid-1" : {    
"photo" : "..."
"date" : "..."
}
// ... and so on
}

我的安全规则是这样定义的。仅显示相关部分。

"photos" : {
"$key" : {
".read" : "auth.uid == $key || root.child('roles/'+auth.uid).val() == 'moderator'",
".write" : "auth.uid == $key"
}
}

从上面的代码片段中可以清楚地看出,我希望用户能够在照片节点下读取或写入自己的密钥。至于版主,我希望他们能够读取任何用户数据。

起初,它似乎按预期工作,但有一个小问题。根据火基,如果在节点上没有指定规则,它将被视为假。这意味着版主现在可以读取每个用户的数据,但前提是他明确要求某些 UID。换句话说,photos/<uid>是允许的,但不允许photos/整体阅读。

一个可能的解决方案是移动read语句以使其成为photos节点的直接子节点。但是在那里我无法为其他用户强制执行$key

人们可能会尝试拆分规则并在两个位置进行定义,但这不起作用,因为根据 firebase 文档,浅层规则将覆盖更深的规则。

您似乎有两个要求:

  1. 每个用户都可以读取和写入自己的照片。
  2. 版主可以阅读所有用户的照片。

这可以在服务器端安全规则中强制执行,如下所示:

"photos" : {
".read" : "root.child('roles/'+auth.uid).val() == 'moderator'",
"$key" : {
".read" : "auth.uid == $key",
".write" : "auth.uid == $key"
}
}

版主从/photos获得的权限会下放到每个用户的照片上。此权限不能在较低级别撤消。但是您绝对可以在较低级别授予用户*额外**权限,这就是这些规则的作用。

最新更新