【问题标题】:firebase security permission not workingfirebase 安全权限不起作用
【发布时间】:2015-06-09 12:58:02
【问题描述】:

我的firebase 中存储了以下数据:

firebaseRoot
    admins
        simplelogin:1: 
    users
        simplelogin:1
            email: abc@xyz.com
            picture: csd
            provider: password
            uid: simplelogin:1
        simplelogin:2
            email: abc1@xyz.com
            picture: zsd
            provider: password
            uid: simplelogin:1

并遵循以下安全规则:

{
  "rules": {
    "admins": {
      ".read": "root.child('admins').child(auth.uid).val() === true",
      ".write": "root.child('admins').child(auth.uid).val() === true"
    },
    "users": {
      "$user":{
        ".read": "$user === auth.id || root.child('admins').child(auth.uid).val() === true",
        ".write": "$user === auth.id"
      }
    }
  }
}

我的授权要求如下。

  1. 管理员只能由现有管理员读取和添加。这行得通。
  2. 管理员可以读取所有用户,但不应写入用户数据。
  3. 用户可以读取和更新自己的用户数据。

目前使用上述规则,我无法读取管理员和登录用户的用户数据。我收到以下错误消息。请提供您的帮助。谢谢。

var rootRef = new Firebase('https://xxxxx.firebaseio.com/');
var users = rootRef.child('users');
users.on('value', function(snap) {
console.log(snap.key(), snap.val());
}, function(error) {
console.log(error);
});

错误:

错误:permission_denied:客户端无权访问所需数据。

【问题讨论】:

    标签: firebase firebase-security firebase-authentication


    【解决方案1】:

    Firebase 安全规则有两个陷阱:

    1. rules cascade

      这意味着一旦您在 JSON 结构中的某个级别授予某人(读取或写入)访问权限,您就不能再在较低级别上立即获得该权限

    2. rules are not filters

      这意味着您只能读取该节点中所有数据的读取权限。如果您只有部分数据的读取权限,则对完整数据的读取操作将失败。

    在您的安全规则中,您只允许阅读(部分)users 下的孩子。所以尝试读取整个users.on('value' 将会失败。

    您可以通过授予管理员.read 访问users 节点的权限来解决此问题。

        "users": {
          ".read": "root.child('admins').child(auth.uid).val() === true",
          "$user":{
            ".read": "$user === auth.id",
            ".write": "$user === auth.id"
          }
        }
    

    【讨论】:

    • 谢谢弗兰克。我几乎放弃了火力基地的安全。我一遍又一遍地阅读了安全规则文档,但我无法完全理解,但是你的回答让我意识到它是多么简单和优雅。我真是感激不尽!
    • 不客气。我们知道两者都是不直观的,但尤其是 #2 有时会使功能比我们希望的更难实现。但目前,我们所能做的就是解释它。不断破解,不断提问!
    • @FrankvanPuffelen 我发现第一个例子在这里不清楚:firebase.google.com/docs/database/security/securing-data 我们无法访问消息列表(/messages → 不允许),我们只能访问一条消息(/message/ message0 → 例如,如果时间戳
    • 同意@Curse。请file a bug report解释为什么这个例子不清楚。
    【解决方案2】:

    这是我的工作示例:

    ajsecuretest
        roles
            simplelogin:1
                role: 'admin'
            simplelogin:2
                role: 'editor'
        users
            simplelogin:1
                 email: 'abc@xyz.com'
                 picture: 'a.jpg'
                 provider: 'password'
                 uid: 'simplelogin:1'
            simplelogin:2
                 email: 'xyz@abc.com'
                 picture: 'b.jpg'
                 provider: 'password'
                 uid: 'simplelogin:2'
    

    规则:

    {
      "rules": {
        "roles":{
          ".read": "root.child('roles').child(auth.uid).child('role').val() === 'admin'",
          ".write": "root.child('roles').child(auth.uid).child('role').val() === 'admin'",
          "$id" : {
            ".read" : "$id === auth.uid"
          }
        },
        "users": {
          ".read" :  "root.child('roles').child(auth.uid).child('role').val() === 'admin'",
          "$user":{        
            ".read": "$user === auth.uid",
            ".write": "$user === auth.uid"
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2018-01-30
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多