首页 > 解决方案 > 如何设置 Firebase 实时数据库以允许开发人员在控制台中标记管理员

问题描述

我可以像这样只将用户保存到数据库中就可以授予用户管理员权限:

export const newUser = (uid) => {
  firebase
    .database()
    .ref("users/" + uid)
    .set(
      {
        admin: false,
        isProfileFilled: false,
        phone: "",
        credit: 0,
        injuries: "",
      },
      function (error) {
        if (error) {
          console.log("error saving to db");
        } else {
          console.log("saved successfully");
        }
      }
    );
};

我的最终目标是能够从 Firebase 控制台手动授予用户管理员访问权限。然后当用户登录时检查他是否是管理员,如果为真则显示所有 UI,如果为假,则用户应由管理员验证,直到向他们显示等待页面,当验证正常用户显示查看特定部分用户界面。此外,管理员应该能够修改用户(例如删除他们或更改他们的信用值)

我可以在不使用 Firebase Admin SDK 的情况下实现上述所有目标,而只需简单地设置和更新数据库中的用户吗?实现我的目标的最佳实践是什么?

标签: javascriptfirebasefirebase-realtime-database

解决方案


当然,它只需要几个步骤:

  1. 在您的数据库中创建一个/admins节点,您将在该节点下存储应用程序管理员的 UID。这个节点的安全规则应该允许每个人都可以读取它,而没有人可以写入它。

    {
      "rules": {
        "admins": {
          ".read": true,
          ".write": false
        }
      }
    }
    

    如果您想更严格地限制谁可以读取此数据,您甚至可以锁定读取,以便用户只能读取他们自己的管理员状态节点。

    {
      "rules": {
        "admins": {
          "$uid": {
            ".read": "auth.uid == $uid"
          },
          ".write": false
        }
      }
    }
    
  2. 当您在 Firebase 控制台中看到应该是应用程序管理员的用户时,请将其 UID 添加到/admins节点。

  3. 在您的应用程序中,/admins/$UID为当前用户读取。如果那里有值,则用户知道他们是应用程序管理员,您可以显示管理 UI。

  4. 在其余的数据库安全规则中,您可以检查以仅允许应用程序管理员执行某些操作。例如,假设您希望任何用户阅读他们自己的个人资料,但管理员能够阅读所有个人资料,这可能是:

    {
      "rules": {
        "admins": {
          "$uid": {
            ".read": "auth.uid == $uid"
          },
          ".write": false
        },
        "users": {
          ".read": "root.child('admins').child(auth.uid).exists()",
          "$uid": {
            ".read": "auth.uid == $uid",
            ".write": "auth.uid == $uid"
          },
        }
      }
    }
    

推荐阅读