我的实时数据库架构是这样设计的。
"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"
}
}
从上面的代码片段中可以明显看出,我希望用户能够在photos节点下读取或写入自己的密钥。至于主持人,我希望他们能够读取任何用户数据。
起初,它似乎按预期工作,但有一个小问题。根据fire-base,如果在节点上未指定任何规则,则将其视为false。这意味着主持人现在可以读取每个用户的数据,但前提是他明确要求特定的UID。换句话说,允许读取photos/<uid>
,但不允许整体读取photos/
。
一个潜在的解决方案是移动read
语句,使其成为photos
节点的直接子代。但是我无法为其他用户强制执行$key
。
一个人可能会尝试拆分规则并在两个位置进行定义,但这将不起作用,因为根据Firebase文档,浅规则将覆盖较深的规则。
答案 0 :(得分:1)
您似乎有两个要求:
这可以在服务器端安全规则中强制执行,如下所示:
"photos" : {
".read" : "root.child('roles/'+auth.uid).val() == 'moderator'",
"$key" : {
".read" : "auth.uid == $key",
".write" : "auth.uid == $key"
}
}
主持人从/photos
获得的许可将保留到每个用户的照片上。此权限不能在较低级别被撤消。但是您绝对可以在较低的级别上授予用户*“额外” **权限,这是这些规则的作用。