我在Firebase上有下一个场景:
有两件事,用户和事件。
我希望用户能够创建新的事件,查看所有现有事件,但只能修改由他们创建的事件。
意味着UserOne创建了EventOne,可以看到EventOne和EventTwo,但只能修改EventOne。
我的结构如下:
-events
-eventOne
endTime:
id:
name:
providerId:
startTime:
userId:
-eventTwo
endTime:
id:
name:
providerId:
startTime:
userId:
-users
-userOne
-userTwo
我目前的规则几乎都是默认规则:
{
"rules": {
"users": {
"$uid": {
// grants write access to the owner of this user account whose uid must exactly match the key ($uid)
".write": "auth !== null && auth.uid === $uid",
// grants read access to any user who is logged in with an email and password
".read": "auth != null && auth.uid == $uid"
}
},
"events": {
".read": "auth != null",
".write": "auth != null"
}
}
}
提前致谢。
答案 0 :(得分:9)
要确保所有用户都能看到所有事件,您可以将事件的读取规则设置为true
或auth != null
,如果您想要要求读者至少使用后者认证
要确保事件只能由其创建者修改,请将原始作者与事件一起记录并使用auth.uid
进行验证。
{
"rules": {
"events": {
"$eventid": {
".read": "auth != null",
".write": "auth != null && (!data.exists() || data.child('author').val() === auth.uid) && newData.hasChild('author')",
"author": {
".write": "newData.val() === auth.uid"
}
}
}
}
}
上面,我们使用!data.exists()
来检查此位置是否存在现有事件。如果不存在任何事件,则任何人都可以在此位置添加一个。接下来,data.child('author').val() === auth.uid
确保如果事件存在,则只有作者可以修改它。