【问题标题】:Firebase: allow to read collection by admins and specific records by usersFirebase:允许管理员读取集合和用户的特定记录
【发布时间】:2017-01-13 23:29:12
【问题描述】:

我有这样的结构:

{ "users": {
  {
    "uid1" : {
      "admin" : true,
      "email" : "admin@app.com",
      "name" : "Admin User"
    },
    "uid2" : {
      "email" : "user1@app.com",
      "name" : "User 1"
    },
    "uid3" : {
      "email" : "user2@app.com",
      "name" : "User 2"
    }
  }
}

我有以下规则,允许管理员或用户自己读取一个用户的数据并按预期工作:

{
  "users": {
    ".read": true,

    "$uid": {
      // data is the user's or user is admin
      ".read": "root.child('users').child(auth.uid).child('admin').val() == true || auth.uid == $uid",
    }
  }
}

除了规则已经允许的内容外,我还需要做什么才能让管理员用户能够列出集合中的所有用户?

【问题讨论】:

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


    【解决方案1】:

    使用 Firebase,一旦您授予权限,就不能再往下撤消它。所以users下的".read": true授予所有用户读取权限。

    您需要更改users 下的规则,使其成为仅适用于管理员的true。这样做还将允许管理员列出用户(并且还应该看到其他规则会影响您期望的行为):

    {
      "users": {
        ".read": "root.child('users').child(auth.uid).child('admin').val() === true",
        "$uid": {
          ".read": "root.child('users').child(auth.uid).child('admin').val() === true || auth.uid === $uid",
        }
      }
    }
    

    这可以简化 - 如 cmets 中所述 - 因为users 下的规则级联下来并且不需要重复:

    {
      "users": {
        ".read": "root.child('users').child(auth.uid).child('admin').val() === true",
        "$uid": {
          ".read": "auth.uid === $uid"
        }
      }
    }
    

    【讨论】:

    • 由于admins的读权限已经级联下来,所以$uid下的admin权限就不用重复了。该规则可以是".read": "auth.uid === $uid"
    • 不错!看起来我误解了文档。工作正常,谢谢!
    猜你喜欢
    • 2021-02-11
    • 2014-04-29
    • 2014-07-16
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多