在Firebase实时数据库规则中,如何授予具有特定子值的用户写访问权限? ,“人”:{ “.read”:“auth!=null”, “$uid”:{ }, “e2”:{ “.read”:“auth.uid!=null”, .write:“$uid==auth.uid” }, “l1”:{ “.read”:“auth.uid!=null”, .write:“auth.uid!=null” }

在Firebase实时数据库规则中,如何授予具有特定子值的用户写访问权限? ,“人”:{ “.read”:“auth!=null”, “$uid”:{ }, “e2”:{ “.read”:“auth.uid!=null”, .write:“$uid==auth.uid” }, “l1”:{ “.read”:“auth.uid!=null”, .write:“auth.uid!=null” },firebase,firebase-realtime-database,firebase-authentication,firebase-security,Firebase,Firebase Realtime Database,Firebase Authentication,Firebase Security,因此e2是电子邮件的@。例如@gmail或@aol或@yahoo。对于l1子级,我想制定写入规则:如果auth.uid!=null,则写入(&e2)与您向其写入l1的人的e2具有相同的值。我能得到的最远值如下: “data.parent().child(people).hasChildren(['auth.uid','l1'])” JSON “人”:{ “02PDINPMW3MYJT3QpuryTPhlaw2”:{ “e2”:“aol.com”, “l1”:4, “X”:{ “e2”:“aol

因此e2是电子邮件的@。例如@gmail或@aol或@yahoo。对于l1子级,我想制定写入规则:如果auth.uid!=null,则写入(&e2)与您向其写入l1的人的e2具有相同的值。我能得到的最远值如下:

“data.parent().child(people).hasChildren(['auth.uid','l1'])”
JSON

“人”:{
“02PDINPMW3MYJT3QpuryTPhlaw2”:{
“e2”:“aol.com”,
“l1”:4,
“X”:{
“e2”:“aol.com”,
“l1”:0,
“P”:{
“e2”:“gmail.com”,
“l1”:0,
基本上l1=like,因此一个用户向另一个用户的l1写入数据的形式是在计数上再加1

应该成功的操作:

用户X想要喜欢uid为02PdiNpmW3MMyJt3qPuRyTpHLaw2的用户。用户X有一个e2子项@aol.com。这与他想要喜欢的用户的e2子项相同。用户X也是一个授权用户,因此他满足向他想要喜欢的用户的l1写入的2个要求

不应成功的操作:


用户p想要喜欢uid为02PdiNpmW3MMyJt3qPuRyTpHLaw2的用户。用户p有一个e2子项@gmail.com。这与他想要喜欢的用户的e2子项不同。因此,用户p不满足向他想要喜欢的用户的l1写入的要求。这是一个非常复杂的场景,所以我将逐步介绍它-一步一个脚印。你很有可能需要做出改变,使这些规则适用于你的整个用例,所以我希望每一步都能让你自己调整它们


第一步是对数据结构进行除臭。我将使用此结构开始:

{
“人”:{
“用户1”:{
“域名”:“aol.com”,
“likeCount”:2,
“喜欢者”:{
“用户2”:{
“comain”:“aol.com”
},
“用户3”:{
“域”:“aol.com”
}
}
}
}
}
因此,
user1
有两个相似之处,
user2
user3
都来自同一个域

我强烈建议在你的数据库中使用像这样有意义的名字,一般来说,但在你发布的问题中肯定是这样。如果人们不容易理解你的数据模型,他们帮助你的机会会迅速下降


在上述数据模型中,我们可以确保只有来自同一域的用户可以通过以下方式喜欢此用户:

“人”:{
“$uid”:{
“喜欢者”:{
“$likerid”:{
.write:“data.parent().parent().child('domain').val()==newData.child('domain').val()”
}
}
}
}
根据这些规则,我尝试了两个写入操作
people/user1/likers/user4
。第一个操作成功:

{
“域”:“aol.com”
}
第二个操作失败:

{
“域”:“gmail.com”
}

我们可能还应该确保一个用户只能编写自己喜欢的内容,而不能为其他用户编写。我们可以通过以下方式实现这一点:

“人”:{
“$uid”:{
“喜欢者”:{
“$likerid”:{
“.write”:“$likerid==auth.uid&&
data.parent().parent().child('domain').val()==newData.child('domain').val()
}
}
}
}

接下来,我们将添加一条规则,允许用户喜欢某个人,前提是他们以前不喜欢他们。我们将在
people/$uid
上这样做,因为我们需要很快查看
likers
likescoount
下的数据

第一步的规则是:

“人”:{
“$uid”:{
“.write”:”
!data.child('likers').child(auth.uid).exists()&&newData.child('likers').child(auth.uid).exists()
",
“喜欢者”:{
“$likerid”:{
“.write”:“$likerid==auth.uid&&
data.parent().parent().child('domain').val()==newData.child('domain').val()
}
}
}
因此,如果我们要添加一个尚不存在的like,这些规则允许我们向用户写入。您可能需要在此处执行其他检查以允许更新其他子节点,但在此处,我们将尽可能简单(因为它已经非常复杂)


最后,您希望确保写入操作也必须增加
likeCount
,它应该是这样的:

“人”:{
“$uid”:{
“.write”:”
!data.child('likers').child(auth.uid).exists()&&newData.child('likers').child(auth.uid).exists()
&&newData.child('likeCount').val()==data.child('likeCount').val()+1
",
“喜欢者”:{
“$likerid”:{
“.write”:“$likerid==auth.uid&&
data.parent().parent().child('domain').val()==newData.child('domain').val()
}
}
}
因此,新行现在检查
处的新数据(如count
)是否比其先前的值高一个


我已经在自己的测试数据库中完成了上面的每一步,并在操场上进行了正面和负面测试。因此,尽管可能存在一些问题,但每一步的基本方法都是有效的


如前所述,这是一个非常复杂的过程,在它完全适用于您的所有用例之前,您很可能需要进行重大的更改。

这是一个非常复杂的场景,因此我将一步一步地介绍它。您很有可能需要进行更改,以使这些规则适用于您的整个用例,所以我很高兴认为每一步都能让你