Firebase用户全部读取,写入新内容,但只修改自己的数据

时间:2015-07-31 00:28:34

标签: authentication firebase rules

我在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"
    }
  }
}

提前致谢。

1 个答案:

答案 0 :(得分:9)

要确保所有用户都能看到所有事件,您可以将事件的读取规则设置为trueauth != 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确保如果事件存在,则只有作者可以修改它。