我在尝试其他用户加注星标作为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)
})