【发布时间】:2017-05-24 08:17:55
【问题描述】:
当 user1 --> user2 (user1 向 user2 发送请求)。我正在尝试使用 firebase 规则执行某些检查,这些规则是:
- 检查 username2 是否存在
- 检查两个用户是否还不是朋友
为此,我编写了以下规则:
{
"rules":
{
"requests":
{
"$requestId":
{
".read": "auth != null",
".write": "auth!=null &&
data.child('username2').val() == true &&
root.child('usernames-list').child( data.child('username2') ).exists() &&
!root.child('user-requests').child( auth.uId ).child('accepted-pending').child($requestId2).child( data.child('username2') ).exists()"
}
}
}
}
但它在两个方面返回以下错误:
- data.child('username2') ----> 第 9 行:child() 需要一个字符串参数。
- data.child($requestId2) ----> 第 9 行:未知变量 $requestId2
数据结构:
requests
---$requestId
---key: value
user-requests
---$userId
---pending
---$requestId
---key: value
---accepted
---$requestId
---key: value
---rejected
---$requestId
---key: value
---unfriend
---$requestId
---key: value
---accepted-pending
---$requestId
---key: value
传入的json:
user1 --> authId of user1
username1 --> username of 1st user
username2 --> username of 2nd user
...
注意 1:我尝试使用 newData. 而不是 data. 并且仍然得到相同的错误。此外,newData('username2').isString() 也返回相同的错误
注意 2:我可以通过创建一个单独的列表来避免 $requestId2(错误),只包含 user1 的朋友的用户名并将其与该用户名进行比较;但我仍然需要能够使用data.('username2') 作为带有root.child() 的字段
编辑1:以下规则发布成功,但我不确定它是否仍然符合我提到的(需要检查):
".write": "auth!=null &&
newData.child('username2').val() == true &&
root.child('usernames-list').hasChild( newData.child('username2').val() ) &&
!root.child('user-requests').child( auth.uId ).child('accepted-pending-usernames').hasChild( data.child('username2').val() )"
参考:Firebase security - newData() as a parameter of hasChildren() expression
【问题讨论】:
-
s/auth.uId/auth.uid/g(换句话说:将auth.uId替换为auth.uid)以消除第一条错误消息。 JavaScript 区分大小写,auth.uIdauth.uid. -
将
$requestId2替换为$requestId以消除第二条错误消息。 -
@FrankvanPuffelen 但是 '$requestId' 和 '$requestId2 '不必总是相同的。因此,它更像是 '$wildcard1' 和 '$wildcard2'
标签: firebase firebase-realtime-database firebase-security