如何通过“允许更新但不允许添加新记录”来设置数据库规则?
我试图在下面模拟,但是不起作用。
我的数据:
{
users:{
-randomID001:{
email:user@email.com,
status:active
},
-randomID002:{
email:user2@email.com,
status:inactive
}
}
}
在控制台中模拟:
{
"rules": {
".read": "auth != null",
"users":{
".indexOn": "email",
".write":"!newData.exists() && data.exists()"
}
}
}
此行代码表示如果不存在新记录且现有记录存在,则允许写入?
".write":"!newData.exists() && data.exists()"
以下是我提交的测试数据:
{
"randomID001":{"status":"inactive"}
}
我遇到以下错误:
Simulated update denied
请告知。
答案 0 :(得分:6)
您可以使用validate来检查数据库中是否已经存在电子邮件,这将仅允许对现有用户进行更新。
"users":{
"$userId":{
".write":"auth!=null",
".validate":"newData.child('email').val()===data.child('email').val()"
}
答案 1 :(得分:1)
Firebase实时数据库模拟器可让您测试[读取,设置,更新]
看起来像在处理Firebase对象。
FIREBASE数据库模型-这是您的
{
users:{
-randomID001:{
email:user@email.com,
status:active
},
-randomID002:{
email:user2@email.com,
status:inactive
}
}
}
尝试使用其他位置
/users/randomID001 // exists in your DB
/users/randomID002 // exists in your DB
/users/randomID003 // not exists in your DB
创建
// newData(json) exists and no randomID001,002 data => FALSE
// newData(json) exists and no randomID003 data => TRUE
".write": "newData.exists() && !data.exists()"
更新
// newData(json) exists and target(randomID001,002) data exists => TRUE
// newData(json) exists and target(randomID003) data exists => FALSE
".write": "newData.exists() && data.exists()"
删除
//You are sending only HTTP DELETE SIGNAL, NOT JSON
//Target(randomID001,002) data exists => TRUE
//Target(randomID003) data exists => FALSE
".write":"!newData.exists() && data.exists()"
下一个示例允许[创建,更新] 您可以认为就像“创建||更新||删除”。
{
"rules": {
"users": {
"$uid":{
".write": "(newData.exists() && !data.exists()) || (newData.exists() && data.exists())"
}
}
}
}
验证规则也是一个好主意。
验证
...
items: {
"$itemId": {
".validate": "newData.hasChildren(['name', 'message', 'timestamp'])",
"name": {
".validate": "newData.val().length > 0 && newData.val().length < 20"
},
"message": {
".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50"
},
"timestamp": {
".validate": "newData.isNumber() && newData.val() == now"
}
}
...
对于代码维护而言, Firebase螺栓是不错的选择。 https://github.com/firebase/bolt/blob/master/docs/language.md