Firebase安全规则:未知变量$ requestId2?

时间:2017-01-09 23:28:55

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

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

  1. 检查username2是否存在
  2. 检查两位用户是否都不是朋友
  3. 为此,我写了以下规则:

    {
      "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
    3. 数据结构:

      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

1 个答案:

答案 0 :(得分: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()"
    
  5. 注意:问题可能仍未解决,因为不清楚firebase是否允许在规则中使用多个通配符