具有在不同位置进行读写的Firebase安全规则

时间:2018-09-02 10:26:44

标签: firebase firebase-realtime-database firebase-security-rules

我的实时数据库架构是这样设计的。

"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文档,浅规则将覆盖较深的规则。

1 个答案:

答案 0 :(得分:1)

您似乎有两个要求:

  1. 每个用户都可以读写自己的照片。
  2. 主持人可以读取所有用户的照片。

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

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

主持人从/photos获得的许可将保留到每个用户的照片上。此权限不能在较低级别被撤消。但是您绝对可以在较低的级别上授予用户*“额外” **权限,这是这些规则的作用。