我想为喜欢的文章创建一个增量字段。
我指的是此链接:https : //firebase.google.com/docs/database/android/save-data#save_data_as_transactions
在示例中,有用于增量字段的代码:
if (p.stars.containsKey(getUid())) {
// Unstar the post and remove self from stars
p.starCount = p.starCount - 1;
p.stars.remove(getUid());
} else {
// Star the post and add self to stars
p.starCount = p.starCount + 1;
p.stars.put(getUid(), true);
}
但是,如何确定用户是否已经喜欢/不喜欢这篇文章呢?
在示例中,用户(黑客)可能会像这样清除整颗星星地图,并且无论如何都会保存:
p.stars = new HashMap<>();
这会破坏其他已经喜欢它的用户的逻辑。
我什至不认为您可以为此制定规则,尤其是对于“减少计数”操作。
有任何帮助,建议吗?
安全规则可以做一些事情:
确保用户只能将自己的添加/删除uid
到stars
节点
"stars": {
"$uid": {
".write": "$uid == auth.uid"
}
}
确保用户只能在starCount
将自己uid
的stars
节点添加到节点或从节点删除节点时更改节点
starCount
1即使有了这些,要确保starCount
具有等于stars
节点中uid数量的安全规则,确实可能仍然很棘手。我鼓励您尝试一下,并分享您的结果。
我见过大多数开发人员处理此问题的方式是:
stars
节点的大小不太大,这是合理的)。stars
到的伺服器上执行的信任程序starCount
。它可以使用child_added / child_removed事件来增加/减少。我写了一个投票系统的工作示例。数据结构为:
votes: {
uid1: true,
uid2: true,
},
voteCount: 2
当用户投票时,该应用会发送多位置更新:
{
"/votes/uid3": true,
"voteCount": 3
}
然后删除他们的投票:
{
"/votes/uid3": null,
"voteCount": 2
}
这意味着应用程序需要使用以下命令显式读取的当前值voteCount
:
function vote(auth) {
ref.child('voteCount').once('value', function(voteCount) {
var updates = {};
updates['votes/'+auth.uid] = true;
updates.voteCount = voteCount.val() + 1;
ref.update(updates);
});
}
它本质上是一个多位置事务,但随后内置了应用程序代码和安全规则,而不是Firebase SDK和服务器本身。
安全规则可以做一些事情:
请注意,规则不会:
.write
规则完成)规则:
"votes": {
"$uid": {
".write": "auth.uid == $uid",
".validate": "(!data.exists() && newData.val() == true &&
newData.parent().parent().child('voteCount').val() == data.parent().parent().child('voteCount').val() + 1
)"
}
},
"voteCount": {
".validate": "(newData.val() == data.val() + 1 &&
newData.parent().child('votes').child(auth.uid).val() == true &&
!data.parent().child('votes').child(auth.uid).exists()
) ||
(newData.val() == data.val() - 1 &&
!newData.parent().child('votes').child(auth.uid).exists() &&
data.parent().child('votes').child(auth.uid).val() == true
)",
".write": "auth != null"
}
jsbin带有一些代码对此进行测试:http ://jsbin.com/yaxexe/edit?js,console
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句