我依靠实时数据库从此结构获取应用程序的数据:
每个A
都有3个B
在以下规则下,阅读效果良好:
{
"rules": {
".read": true,
".write": false
}
}
现在,我处于测试模式,我想实现两项:
1。。授予用户权限,将唯一性写入每个/../B3/
中的路径A
。
2。。用户在/../B3/
中输入的值必须是数字(最好是Integer)。
因此,我进行了一些研究并提出了以下规则:
{
"rules": {
"A1":{
"B1":{
".read": true,
".write": false
},
"B2":{
".read": true,
".write": false
},
"B3":{
".read": true,
".write": true,
".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
}
},
"A2":{
"B1":{
".read": true,
".write": false
},
"B2":{
".read": true,
".write": false
},
"B3":{
".read": true,
".write": true,
".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
}
},
"A3":{
"B1":{
".read": true,
".write": false
},
"B2":{
".read": true,
".write": false
},
"B3":{
".read": true,
".write": true,
".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
}
}
}
问题:
我在Firebase控制台上使用游乐场模拟器测试了这些规则,并获得了正确的结果。但是,当我尝试在测试设备上对/../B3/
进行读取或写入操作时,此操作无效。相反,我在LogCat中得到了此异常:
com.google.firebase.database.DatabaseException: Firebase Database error: Permission denied
at com.google.firebase.database.DatabaseError.toException(com.google.firebase:firebase-database@@16.0.4:229)
at com.app.activity$3.onCancelled(activity.java:567)
我认为我在构造规则方面缺少一些东西。预先感谢。
答案 0 :(得分:1)
据我所知,规则的结构必须为
{
"rules": {
"A1":{
"B1":{
".read": true,
".write": false
},
"B2":{
".read": true,
".write": true //changed
".validate": "newData.isNumber() && newData.val() % 1 === 0.0" //added
},
"B3":{
".read": true,
".write": false, //changed
}
}
.
. //rest of the rules in the same pattern
.
因为您希望用户唯一地写到每个/../B2
子树中的A
节点,所以应该仅允许他们访问{{1 }}节点在每个/../B2
子树中
也不需要A
上的 .validate 规则,您不希望用户写这些规则。
.validate
.write规则授予访问权限后使用,以确保所写入的数据符合特定的架构。
最后,/../B3
上必须存在一个 .validate 语句,以检查数字是否为整数。
至于异常,很明显出现了/../B2
错误,因为 .write 已在Permission Denied
中设置为false
。>
另外,请注意,设置/../B2
不仅允许您的用户写入数据库,还允许任何人以{{3} }指出
在开发过程中,可以使用公共规则代替默认规则来将文件设置为公共可读和可写。这对于原型制作很有用,因为您无需设置身份验证即可开始使用。这种访问级别意味着任何人都可以读取或写入您的数据库。您应该在启动应用之前配置更安全的规则。
因此,如果丝毫没有安全性的问题,请查看规则,以确保您已采取措施实施安全性。
最后,希望这能回答您的问题
答案 1 :(得分:0)
我终于解决了这个! ew!
解决方案:
{
"rules": {
".read": true, //The difference
"A1":{
"B3":{
".write": true,
".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
}
},
"A2":{
"B3":{
".write": true,
".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
}
},
"A3":{
"B3":{
".write": true,
".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
}
}
}
说明:
我缺少读取根节点的权限,并且根据级联原理,如果您无法访问其父节点(即使每个孩子都使用".read": true
,也无法访问其子节点)。 (逻辑!)
找到它的地方:一段43分钟的视频The key to Firebase security - Google I/O 2016:P