我正在开发一个Android项目,用户可以在Firebase中将POJO添加到自己的节点,但前提是用户具有管理员权限。
在我的Firebase数据库中,我的规则设置如下
"userAddedCars":{
"$uid":{
".read" : "$uid == auth.uid",
".write" : "$uid == auth.uid && root.child('users').child(auth.uid).child('admin').val() == true"
}
}
典型的用户节点如下所示:
root{
"users"{
"0MFmZkhIPAP4ccrdfY5F4uiCrNB3" : {
"admin" : true,
"email" : "pkj@bjj.com"
}
}
}
我已经使用规则$uid == auth.uid
进行了测试,它按预期工作,即只能写入其个人节点。但是,当与此规则root.child('users').child(auth.uid).child('admin').val() == true
配对时,似乎auth.uid
无法获得正确的UID,因为它无法按预期工作,但如果我对UID进行硬编码,则会再次开始工作。
我不确定为什么auth.uid
会在某些时候起作用,但并非总是如此。
用于添加POJOS的代码
mRef = mRef.child("userAddedCars").child(UID);
mRef.child("car1").setValue(nCar);
答案 0 :(得分:1)
有点不清楚你要从问题中完成什么,所以这里是我的假设和随附的解决方案
假设1:
您拥有管理员与否的用户组,并且每个用户都有一组私人列出的二手车。虽然用户可以看到添加到他/她的私人用户新车列表中的所有汽车,但如果他们启用了管理员权限,则他们只能添加/更新/修改它们。
PS:用户始终经过身份验证
<强> 解决方案 强>
您当前的规则设置是正确的,它会起作用。
auth.uid
是客户端设备上当前经过身份验证的用户的UID,与上面的示例数据集相关,如果您的登录UID已成功,您将能够成功执行setValue
代码admin属性在用户节点下设置为true,就像用户0MFmZkhIPAP4ccrdfY5F4uiCrNB3
一样。
如果这是你失败的地方,你将不得不详细说明其工作地点和不工作的情况以及用于进一步调试问题的数据集。
假设2:
虽然所有用户都拥有一组私人列出的二手车,但您有时可以管理这些用户。虽然用户可以查看和编辑添加到他/她的私人用户新车列表中的所有汽车,但如果用户是管理员,那么他也可以为其他用户添加/更新/修改汽车...
PS:用户始终经过身份验证
<强> 解决方案 强>
使用以下规则集
{
"rules": {
"userAddedCars": {
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid || root.child('users').child(auth.uid).child('admin').val() == true"
}
}
}
}