【问题标题】:Firebase Security Rules: Unknown variable $requestId2?Firebase 安全规则:未知变量 $requestId2?
【发布时间】:2017-05-24 08:17:55
【问题描述】:

当 user1 --> user2 (user1 向 user2 发送请求)。我正在尝试使用 firebase 规则执行某些检查,这些规则是:

  1. 检查 username2 是否存在
  2. 检查两个用户是否还不是朋友

为此,我编写了以下规则:

{
  "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()"
      }
    }
  }
}

但它在两个方面返回以下错误:

  1. data.child('username2') ----> 第 9 行:child() 需要一个字符串参数。
  2. 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.uId auth.uid.
  • $requestId2 替换为$requestId 以消除第二条错误消息。
  • @FrankvanPuffelen 但是 '$requestId' 和 '$requestId2 '不必总是相同的。因此,它更像是 '$wildcard1' 和 '$wildcard2'

标签: firebase firebase-realtime-database firebase-security


【解决方案1】:

编辑2:这应该是解决方案:

  1. .val() 已添加到括号中
  2. .exists() 留在最后
  3. 我创建了一个单独的用户名列表 (/accepted-pending-usernames/) 来解决通配符错误
  4. data 已替换为 newData

    ".write":  "auth!=null && 
                newData.child('username2').val() == true && 
                root.child('usernames-list').child( newData.child('username2').val() ).exists() && 
                !root.child('user-requests').child( auth.uId ).child('accepted-pending').child('accepted-pending-usernames').child( data.child('username2').val() ).exists()"
    

注意:问题可能仍未解决,因为不清楚 Firebase 是否允许在规则中使用多个通配符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2023-03-09
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2020-09-13
    • 2016-08-19
    相关资源
    最近更新 更多