我的实时数据库模式是这样设计的。
"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"
}
}从上面的片段中可以清楚地看到,我希望用户能够在“照片”节点下读写自己的密钥。至于版主,我希望他们能够阅读任何用户的数据。
起初,它似乎像预期的那样起作用,但有一个小问题。根据火力基,如果节点上没有指定规则,则它将被视为false。这意味着版主现在可以读取每个用户的数据,但前提是他明确地要求特定的UID。换句话说,阅读photos/<uid>是被允许的,但是作为一个整体,photos/是不允许的。
一个潜在的解决方案是移动read语句,使其成为photos节点的直接子节点。但在那里,我不能为其他用户执行$key。
您可能尝试拆分规则并在两个位置进行定义,但这是行不通的,因为根据火基文档,浅层规则将覆盖更深层次的规则。
发布于 2018-09-02 14:43:30
你似乎有两个要求:
它可以在服务器端安全规则中强制执行,如下所示:
"photos" : {
".read" : "root.child('roles/'+auth.uid).val() == 'moderator'",
"$key" : {
".read" : "auth.uid == $key",
".write" : "auth.uid == $key"
}
}版主从/photos获得的权限将传递到每个用户的照片上。不能在较低级别撤销此权限。但是,您肯定可以在较低级别授予用户*额外的**权限,这些规则就是这样做的。
https://stackoverflow.com/questions/52136088
复制相似问题