firebase 安全权限不起作用
firebase security permission not working
我的 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"
}
}
}
}
我的授权要求如下。
- 管理员只能由现有管理员读取和添加。这行得通。
- 管理员可以读取所有用户,但不能写入用户数据。
- 用户可以读取和更新自己的用户数据。
目前使用上述规则,我无法读取管理员和登录用户的用户数据。我收到以下错误消息。请提供你的帮助。谢谢。
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);
});
错误:
Error: permission_denied: Client doesn't have permission to access the desired data.
Firebase 安全规则有两个陷阱:
-
这意味着一旦您在 JSON 结构的某个级别上授予某人(读或写)访问权限,您就不能再在较低级别上立即获得该权限
-
这意味着如果您对该节点中的所有数据具有读取权限,则只能读取该节点。如果您只有部分数据的读取权限,则对完整数据的读取操作将失败。
在您的安全规则中,您只允许阅读 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"
}
}
这是我的工作示例:
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"
}
}
}
}
我的 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"
}
}
}
}
我的授权要求如下。
- 管理员只能由现有管理员读取和添加。这行得通。
- 管理员可以读取所有用户,但不能写入用户数据。
- 用户可以读取和更新自己的用户数据。
目前使用上述规则,我无法读取管理员和登录用户的用户数据。我收到以下错误消息。请提供你的帮助。谢谢。
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);
});
错误:
Error: permission_denied: Client doesn't have permission to access the desired data.
Firebase 安全规则有两个陷阱:
-
这意味着一旦您在 JSON 结构的某个级别上授予某人(读或写)访问权限,您就不能再在较低级别上立即获得该权限
-
这意味着如果您对该节点中的所有数据具有读取权限,则只能读取该节点。如果您只有部分数据的读取权限,则对完整数据的读取操作将失败。
在您的安全规则中,您只允许阅读 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"
}
}
这是我的工作示例:
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"
}
}
}
}