Firebase安全规则,在不同位置具有读写功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"
    }
}

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

起初它似乎按预期工作,但有一个小问题。根据fire-base,如果在节点上没有指定规则,则将其视为false。这意味着主持人现在可以读取每个用户数据,但前提是他明确要求某些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获得的许可可以记录每个用户的照片。此权限不能在较低级别撤销。但是你绝对可以给用户*更低级别的**权限,这就是这些规则的作用。

以上是关于Firebase安全规则,在不同位置具有读写功能的主要内容,如果未能解决你的问题,请参考以下文章

群组的 Firebase 存储安全规则

Firebase 安全规则完全打开,但仍然授予权限被拒绝错误

读取 Firebase 存储映像安全规则

在 Angular 11 网站上使用 Firestore 和 Firebase 存储进行图像上传功能导致来自 Firebase 的不安全规则通知

Firebase 安全规则阻止写入 Firebase

Firebase 存储安全规则和上传文件的下载令牌