在我使用Firebase创建的iOS应用中,每个用户都有一个唯一的用户名,他们在用电子邮件和密码注册后创建。为什么此Firebase数据库安全规则使用&&和||不工作
所以,如果有[email protected]的电子邮件用户已经签署了,然后必须创建一个唯一的用户名这是不是在用户名数据库的数据库的一个片段将如下:
"usernames" : {
"test" : "r6KPesUr1qORfIJke07SloZHeNW2",
"test1" : "jSMSkY9rHtdNkXoLrsFmCAXdY9n2",
"test7" : "jnFhJbgCjZeJFx0hspObqoskQej2",
"test8" : "HtnULzU0lnZKYva2M2Wepl6N8wE3"
},
"users" : {
"HtnULzU0lnZKYva2M2Wepl6N8wE3" : {
"email" : "[email protected]",
"username" : "test8"
},
"boX6rtJ98haWVxNoXfSq21maCVU2" : {
"email" : "[email protected]"
},
"jSMSkY9rHtdNkXoLrsFmCAXdY9n2" : {
"email" : "[email protected]",
"username" : "test1"
},
"jnFhJbgCjZeJFx0hspObqoskQej2" : {
"email" : "[email protected]",
"username" : "test7"
},
"r6KPesUr1qORfIJke07SloZHeNW2" : {
"email" : "[email protected]",
"username" : "test"
}
}
我有以下安全规则来确保用户完成注册时用户名是唯一的。
// USERNAMES
"usernames": {
".read": "auth.uid != null",
".write": "auth.uid != null",
"$username": {
".validate": "(!root.child('usernames').hasChild($username.toLowerCase()) && newData.val() == auth.uid &&
root.child('users').hasChild(auth.uid)) &&
(root.child('users/'+auth.uid+'/username').val().toLowerCase() == $username ||
!root.child('users/'+auth.uid+'/username').exists())"
}
}
因为我想有这三个语句作为必备品
(!root.child('usernames').hasChild($username.toLowerCase()) &&
newData.val() == auth.uid &&
root.child('users').hasChild(auth.uid))
的验证规则,并与这两个语句其中之一必须是真实的
"(root.child('users/'+auth.uid+'/username').val().toLowerCase() == $username ||
(!root.child('users/'+auth.uid+'/username').exists()"
所以如果用户想要注册test5作为用户名与下面的JSON那么它不会与我目前的安全规则,由于第一部分OR语句。
"users": {
"boX6rtJ98haWVxNoXfSq21maCVU2": {
"username": "test5"
}
}
我在做什么错?
解析规则非常困难。你可以编辑你的问题,包括将被这个验证规则拒绝的最小代码,但你想允许吗? –
@FrankvanPuffelen肯定的事情。我已经添加了数据库的外观以及后来未能写入的json为用户创建一个唯一的用户名,邮件地址为[email protected] – Edward
OK。我试图弄清楚你的用例。但是从这样复杂的规则中理解很困难,所以我分离出了一个(两个)特定的用例,并专注于此。 –