Javascript 具有用户角色的FireBase安全规则
首先,我之前研究过这个问题,我引用了前面的一个问题。我做了问题中所述的事情,但没有取得积极的结果 我正在使用:Javascript 具有用户角色的FireBase安全规则,javascript,json,firebase,angularfire,Javascript,Json,Firebase,Angularfire,首先,我之前研究过这个问题,我引用了前面的一个问题。我做了问题中所述的事情,但没有取得积极的结果 我正在使用: Angular JS Firebase AngularFire -- Integrate Firebase with AngularJS E-mail and Password Firebase Authentication 我在Firebase中为我的用户设置了一个节点: "users" : { "simplelogin:49" : { "email" : "mye
Angular JS
Firebase
AngularFire -- Integrate Firebase with AngularJS
E-mail and Password Firebase Authentication
我在Firebase中为我的用户设置了一个节点:
"users" : {
"simplelogin:49" : {
"email" : "myemail@something.com",
"full_name" : "First Last",
"roles" : {
"administrator" : true
}
},
"simplelogin:64" : {
"email" : "me@me.com",
"full_name" : "first last",
"roles" : {
"administrator" : false
}
}
}
在登录到simplelogin:49
时,我试图在我的客户表中添加一个条目,您可以看到该条目是管理员
// Create the Client
var clientRef = firebaseUrl+'clients';
var clientsListRef = new Firebase(clientRef);
clientsListRef.push({
'uid': userData.uid,
'number': cl.number,
'company': cl.company,
'full_name': cl.full_name,
'email': cl.email,
'phones': {
'primary': cl.phones.primary,
'cell': cl.phones.cell,
'alte': cl.phones.alte
},
'addresses': {
'billing': {
'line1': cl.addresses.billing.line1,
'line2': cl.addresses.billing.line2,
'city' : cl.addresses.billing.city,
'state': cl.addresses.billing.state,
'zip' : cl.addresses.billing.zip
},
'shipping': {
'line1': cl.addresses.shipping.line1,
'line2': cl.addresses.shipping.line2,
'city' : cl.addresses.shipping.city,
'state': cl.addresses.shipping.state,
'zip' : cl.addresses.shipping.zip
}
}
});
我在Firebase中为客户机
节点设置了一些规则,如下所示:
"clients": {
"$auth": {
".write": "root.child('users').child('$auth.uid').child('roles').child('administrator').val() === true"
}
}
我还尝试了以下规则:
"clients": {
".write": "root.child('users').child('auth.uid').child('roles').child('administrator').val() === true"
}
当我运行这个程序时,我得到的只是一个权限被拒绝的错误。如果我在Firebase模拟器中运行它,结果如下:
Attempt to write Success({"user":"Test"}) to /clients with auth=Success({"id":49,"provider":"password","uid":"simplelogin:49"})
/
/clients:.write: "root.child('users').child('auth.uid').child('roles').child('administrator').val() === true"
=> false
No .write rule allowed the operation.
Write was denied.
我只想知道我错过了什么。问题中的人说他/她在他们的企业中取得了成功 首先,您应该使用为每个用户自动生成的Firebase身份验证用户id。您必须查看AngularFire文档,了解如何访问经过身份验证的用户id,但通常是以下内容:
firebase.auth().currentUser().uid
然后,一旦创建了该id作为字典名称的用户,如下所示:
"users" : {
"Rx6H4mjwwgVo6UKy2vSuOD5dTwk2" : {
"email" : "myemail@something.com",
"full_name" : "First Last",
"roles" : {
"administrator" : true
}
},
"U1x3narB2AQQ0FvMxu7RVQAxb7A2" : {
"email" : "me@me.com",
"full_name" : "first last",
"roles" : {
"administrator" : false
}
}
}
您可以使用Firebase数据库安全规则中的auth.uid
变量获取其用户id:
"rules" : {
"clients": {
".write": "root.child('users').child(auth.uid).child('roles').child('administrator').val() == true"
}
}
不确定这是否是全部错误,但至少
child('$auth.uid')
应该是child($auth.uid)
(因此没有引号)$auth
是一个变量,而'$auth'
只是一个字符串文字。您的数据示例列出了用户
,但您的安全规则引用了客户端
。如果代码不能准确地再现产生问题所需的条件,我们不确定我们能提供多少帮助。请参见Frank Van Puffelen——当我删除引号时,Firebase抛出一个错误,指出不存在这样的方法或属性。文档中还引用了引号。()Kato--我正在为引用用户节点的客户机节点设置规则。如果该用户是管理员,则该用户可以向“客户端”节点写入或添加客户端。显然,没有人知道如何在firebase中使用基于角色的值