Firebase实时数据库安全规则,以允许特定用户

时间:2018-08-15 05:31:41

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

我当前的firebase实时安全规则如下

{
  "rules": {
    "users": {
      ".read" : true,
      ".indexOn": ["email"],
      "$user_id": {
        ".read": true,
        ".write": "auth != null && $user_id === auth.uid"
      }
    }
  }
}

他们转换为只有经过身份验证的用户才能将数据写入到users /之下的自己的节点

但是,我们有管理员用户,他们应该能够修改非管理员用户的数据。

我们识别管理员用户的方式是用户属性isAdmin,这对于管理员用户是正确的。因此,具有管理员和非管理员用户的示例数据如下所示:

{
"users": {
 "kldjjfjf" : {
                 "name": "vik", "isAdmin": true
              },
 "lfllfomr": {
                 "name": "neeti", "isAdmin": false
             }
}

请告知处理此类用例的最佳实践是什么?进行.write true将解决该问题,但随后它将使所有人可以修改任何人的数据。

2 个答案:

答案 0 :(得分:2)

我发现允许管理员访问的最简单方法是:

  1. 对管理员使用自定义声明
  2. 使用管理员UID白名单

对管理员使用自定义声明

您可以使用Admin SDK向Firebase身份验证用户配置文件添加自定义声明。声明是您确定自己含义的自定义键/值对。文档中的第一个示例显示了setting a claim called admin to true,例如使用Node.js的Admin SDK:

admin.auth().setCustomUserClaims(uid, {admin: true}).then(() => {
// The new custom claims will propagate to the user's ID token the
// next time a new one is issued.
});

设置了自定义声明后,它将在登录时传输到客户端,并且在安全规则中也可用。您可以使用以下方法检查以上内容:

".write": "auth != null && ($user_id === auth.uid || auth.token.admin === true)"

使用管理员UID白名单

一个简单的替代方法是将具有特定特权的UID列表存储在用户数据库中。例如,您可能有一个顶级Admins列表:

Admins
  uidOfVik: true
  uidOfPuf: true

以上表示您和我是管理员。然后,检查安全规则中的内容:

".write": "auth != null && ($user_id === auth.uid || root.child('Admins').child(auth.uid).exists())"

答案 1 :(得分:0)

这是另一种选择:

Firebase安全规则仅适用于正常连接到应用程序的客户端。

如果您有自己的后端(我不能这么认为,因为Firebase是用于无服务器计算的),那么它可以使用管理SDK连接到应用程序,而绕过安全规则。

或者,您可以为您的管理员用户创建一个单独的应用程序,该应用程序将使用admin SDK连接到firebase。

更多信息:Firebase Documentation - Firebase Admin SDK

相关问题