firebase安全权限不起作用

时间:2015-06-09 12:58:02

标签: firebase firebase-security firebase-authentication

我有以下数据存储在我的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. 用户可以阅读和更新自己的用户数据。
  4. 目前有上述规则,我无法为管理员和登录用户读取用户数据。我收到以下错误消息。请提供帮助。感谢。

    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:客户无权访问所需数据。

2 个答案:

答案 0 :(得分:4)

Firebase安全规则存在两个缺陷:

  1. rules cascade

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

  2. rules are not filters

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

  3. 在您的安全规则中,您只允许阅读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"
          }
        }
    

答案 1 :(得分:1)

以下是我的工作示例:

    // create a ContentPane as the Top pane in the BorderContainer
    var cp0 = new ContentPane({
        region: "top",
        content: "This is The Top!"
    });
    bc.addChild(cp0);

规则:

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'