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文档,浅层规则将覆盖更深层次的规则。
答案
你似乎有两个要求:
- 每个用户都可以读写自己的照片。
- 主持人可以阅读所有用户的照片。
这可以在服务器端安全规则中强制执行,如下所示:
"photos" : {
".read" : "root.child('roles/'+auth.uid).val() == 'moderator'",
"$key" : {
".read" : "auth.uid == $key",
".write" : "auth.uid == $key"
}
}
主持人从/photos
获得的许可可以记录每个用户的照片。此权限不能在较低级别撤销。但是你绝对可以给用户*更低级别的**权限,这就是这些规则的作用。
以上是关于Firebase安全规则,在不同位置具有读写功能的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 安全规则完全打开,但仍然授予权限被拒绝错误
在 Angular 11 网站上使用 Firestore 和 Firebase 存储进行图像上传功能导致来自 Firebase 的不安全规则通知