Firebase,Swift - runTransactionBlock:权限被拒绝

时间:2016-07-06 10:57:49

标签: ios swift firebase firebase-realtime-database

我在尝试其他用户加注星标作为runTransaction时遇到了问题" Permission denied"通过Firebase。我在Firebase安全规则下面添加了帖子,然后是快速的交易代码。

在这种情况下我的错是什么?如果我先做了#34; .write"规则为" auth!= null"它适用于每个人。但我不想要这个。我想阻止其他节点,只有starCounter和Stars需要更改。

如果有人解释并解释,那就太好了。

"posts": {
      ".read": "auth !== null",
      "$id": {
        ".write": "auth != null  && (
                   (!data.exists() && newData.child('ownerID').val() == auth.uid) ||
                   (!newData.exists() && data.child('ownerID').val() == auth.uid) ||
                         root.child('admins').hasChild(auth.uid))",
        "starCounter": {
            ".write": "auth !== null"
        },
        "stars": {
            ".write": "auth !== null"
        },
      }
    },

以下是我的Swift交易代码..

DataService.ds.REF_POSTS.child("\(self.post.postKey!)").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in

      if var post = currentData.value as? [String: AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid {

          var stars : Dictionary<String, Bool>
          stars = post["stars"] as? [String : Bool] ?? [:]
          var starCount = post["starCounter"] as? Int ?? 0

          if let _ = stars[uid] {

              // Unstar the post and remove self from stars
              starCount -= 1
              stars.removeValueForKey(uid)
              self.starBtn.setBackgroundImage(UIImage(named: "star-full"), forState: .Normal)
              self.starBtn.setTitle("unstar", forState: .Normal)

          }
          else {

              // Star the post and add self to stars
              starCount += 1
              stars[uid] = true
              self.starBtn.setBackgroundImage(self.starImageView!.image!, forState: .Normal)
              self.starBtn.setTitle("star", forState: .Normal)
          }

          post["starCounter"] = starCount
          post["stars"] = stars

          currentData.value = post

          DataService.ds.REF_POSTS.child("\(self.post.postKey!)").child("starCounter").observeSingleEventOfType(.Value, withBlock: { snapshot in

              if let starCount = snapshot.value as? Int {
                  self.starCountLbl.text = "\(starCount)"
              }

          })

          return FIRTransactionResult.successWithValue(currentData)

      }

      return FIRTransactionResult.successWithValue(currentData)
  })

更新

我有一个帖子节点,如下所示。我希望每个人都能处理“starCounter”和“明星”可达(写和读)。但其他人只能由所有者写。我正在使用runTransaction在Save data as transactions中使用几乎相同的方法。但是,我正在尝试拒绝其他用户(auth.uid)并不仅是所有者的帖子。所以我无法通过交易增加星级计数器并在星型节点中添加谁。

posts
  post_id_0
    post_title
    post_description
    post_ownerID
    ...
    starCounter
    stars
     person_1: true
     person_2: true
     ...
  post_id_1
  ..

我在安全规则第一次建议之前已经尝试过(这是一个答案〜10m之前),但它没有帮助,我无法添加新帖子。我不知道在安全规则中我究竟缺少什么来在同一父节点中执行此操作。

针对上述安全规则减少了以下代码..

post_ref.child("\(self.post.postKey!)").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in
    if var post = currentData.value as? [String: AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid {
        var stars : Dictionary<String, Bool>
        stars = post["stars"] as? [String : Bool] ?? [:]
        var starCount = post["starCounter"] as? Int ?? 0
        if let _ = stars[uid] {
            starCount -= 1
            stars.removeValueForKey(uid)
        }
        else {
            starCount += 1
            stars[uid] = true
        }
        post["starCounter"] = starCount
        post["stars"] = stars
        currentData.value = post
        return FIRTransactionResult.successWithValue(currentData)
    }
    return FIRTransactionResult.successWithValue(currentData)
})

0 个答案:

没有答案