数据验证问题 Firebase 实时数据库规则
Data validation issue Firebase RealTime Database rules
我正在尝试制定一些安全规则以允许经过身份验证的用户访问(读/写)chats
基于数据验证的某些条件的路径。
这是我的规则:
{
"rules": {
"chats": {
"$chatID": {
".read": "data.child('members/'+auth.uid).exists()",
".write": "(!data.exists() && newData.child('members').exists() && newData.child('members/'+auth.uid).exists()) || data.child('members/'+auth.uid).exists()",
}
},
}
}
这是我的 json :
{
"chats/1d771b40-917c-11ec-b57d-a55c6126c658":{
"uid":"1d771b40-917c-11ec-b57d-a55c6126c658",
"name":"",
"updatedAt":1645272534466,
"createdAt":1645272279796,
"senderID":"user1",
"members":{
"user1":true,
"user2":true
},
"created":true,
}
}
我不明白为什么它被拒绝写入,你能解释一下哪个值 newData
准确吗?
我已经设置了一个非常基本的规则来测试:
{
"rules": {
"chats": {
"$chatID": {
".read": "data.child('members/'+auth.uid).exists()",
".write": "newData.child('members').exists()",
}
}
}
}
被拒绝了,我也试过了:
{
"rules": {
"chats": {
"$chatID": {
".read": "data.child('members/'+auth.uid).exists()",
".write": "newData.parent().child('members').exists()",
}
}
}
}
根据 documentation,我认为 newData
包含 json 如果给定路径允许写入,将会发生的数据,在这种情况下意味着:
{
"uid":"1d771b40-917c-11ec-b57d-a55c6126c658",
"name":"",
"updatedAt":1645272534466,
"createdAt":1645272279796,
"senderID":"user1",
"members":{
"user1":true,
"user2":true
},
"created":true,
}
如果我理解正确,为什么 newData.child('members').exists()
returns 错误?
我也测试了 newData.hasChild('members')
和 newData.hasChildren(['members'])
但都给出了相同的结果(错误)。
提前致谢
您应该传递更新请求数据中指定 path/locations 中应该包含的确切 JSON。
因此更新聊天的位置将是:chats/{chatId}
和 data/payload,如下所示:
{
"uid": "1d771b40-917c-11ec-b57d-a55c6126c658",
"name": "",
"updatedAt": 1645272534466,
"createdAt": 1645272279796,
"senderID": "user1",
"members": {
"user1": true,
"user2": true
},
"created": true
}
我正在尝试制定一些安全规则以允许经过身份验证的用户访问(读/写)chats
基于数据验证的某些条件的路径。
这是我的规则:
{
"rules": {
"chats": {
"$chatID": {
".read": "data.child('members/'+auth.uid).exists()",
".write": "(!data.exists() && newData.child('members').exists() && newData.child('members/'+auth.uid).exists()) || data.child('members/'+auth.uid).exists()",
}
},
}
}
这是我的 json :
{
"chats/1d771b40-917c-11ec-b57d-a55c6126c658":{
"uid":"1d771b40-917c-11ec-b57d-a55c6126c658",
"name":"",
"updatedAt":1645272534466,
"createdAt":1645272279796,
"senderID":"user1",
"members":{
"user1":true,
"user2":true
},
"created":true,
}
}
我不明白为什么它被拒绝写入,你能解释一下哪个值 newData
准确吗?
我已经设置了一个非常基本的规则来测试:
{
"rules": {
"chats": {
"$chatID": {
".read": "data.child('members/'+auth.uid).exists()",
".write": "newData.child('members').exists()",
}
}
}
}
被拒绝了,我也试过了:
{
"rules": {
"chats": {
"$chatID": {
".read": "data.child('members/'+auth.uid).exists()",
".write": "newData.parent().child('members').exists()",
}
}
}
}
根据 documentation,我认为 newData
包含 json 如果给定路径允许写入,将会发生的数据,在这种情况下意味着:
{
"uid":"1d771b40-917c-11ec-b57d-a55c6126c658",
"name":"",
"updatedAt":1645272534466,
"createdAt":1645272279796,
"senderID":"user1",
"members":{
"user1":true,
"user2":true
},
"created":true,
}
如果我理解正确,为什么 newData.child('members').exists()
returns 错误?
我也测试了 newData.hasChild('members')
和 newData.hasChildren(['members'])
但都给出了相同的结果(错误)。
提前致谢
您应该传递更新请求数据中指定 path/locations 中应该包含的确切 JSON。
因此更新聊天的位置将是:chats/{chatId}
和 data/payload,如下所示:
{
"uid": "1d771b40-917c-11ec-b57d-a55c6126c658",
"name": "",
"updatedAt": 1645272534466,
"createdAt": 1645272279796,
"senderID": "user1",
"members": {
"user1": true,
"user2": true
},
"created": true
}