Firebase规则 - 限制对管理员的访问

时间:2018-06-11 22:09:54

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

我的Firebase数据库中有一个adminContent节点,如果用户将admin设置为true作为自定义声明,则该节点应该只能读/写。

以下代码显示我的一个测试用户HAS admin设置为true作为声明而一个测试用户没有(因此问题似乎没有正确设置声明):

/* Check if admin */
firebase.auth().currentUser.getIdTokenResult().then(function(idTokenResult) {
   if (idTokenResult.claims.admin) {
    // THIS PART IS EXECUTED

   }
});

这些是我的规则:

{
  "rules": {
    "metadata": {
      "$user_id": {
        // Read access only granted to the authenticated user.
        ".read": "$user_id === auth.uid",
        // Write access only via Admin SDK.
        ".write": false
      }
    },
    "adminContent": {
      ".read": "auth.token.admin === true",
      ".write": "auth.token.admin === true",
    }
  }
}

两个测试用户(一个有admin声明,一个没有)都能读写adminContent。当我使用两个用户的UID在Firebase控制台上的规则下测试模拟器时,没有人获得许可。

数据结构如下:

adminContent
    adminEmails
    announcements
metadata
    ...
users
    ...

我的规则有什么问题吗?为什么模拟器和真实场景不同?

1 个答案:

答案 0 :(得分:0)

令牌可能已过时,即。在发出ID令牌后设置了自定义声明。令牌生存期为1小时。因此,在下次刷新之前,令牌将不会获取最新的声明。通过调用以下方法设置自定义声明后,您可以强制刷新它:

firebase.auth().currentUser.getIdTokenResult(true)...