【问题标题】:Firebase rules - restricting access to adminFirebase 规则 - 限制对管理员的访问
【发布时间】:2018-11-21 05:39:16
【问题描述】:

我的 Firebase 数据库中有一个 adminContent 节点,只有当用户将 admin 设置为 true 作为自定义声明时,该节点才应该可以读/写访问。

以下代码显示我的一位测试用户已将管理员设置为 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",
    }
  }
}

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

数据结构如下:

adminContent
    adminEmails
    announcements
metadata
    ...
users
    ...

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

【问题讨论】:

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


    【解决方案1】:

    令牌可能已过时,即。自定义声明是在 ID 令牌发布后设置的。令牌生命周期为 1 小时。所以在下一次刷新之前,令牌不会获取最新的声明。您可以通过调用设置自定义声明后强制刷新:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多