5

我有以下数据存储在我的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:客户端无权访问所需数据。

4

2 回答 2

5

Firebase 安全规则有两个陷阱:

  1. 规则级联

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

  2. 规则不是过滤器

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

在您的安全规则中,您只允许阅读(部分)下的孩子users。因此,尝试阅读全文users.on('value'将失败。

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

    "users": {
      ".read": "root.child('admins').child(auth.uid).val() === true",
      "$user":{
        ".read": "$user === auth.id",
        ".write": "$user === auth.id"
      }
    }
于 2015-06-09T13:48:48.253 回答
1

这是我的工作示例:

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"
      }
    }
  }
}
于 2015-06-10T04:39:42.523 回答