对于启用了基于电子邮件/密码的身份验证的Firebase Database
,我们如何授予登录Firebase支持的iOS应用程序的用户的读/写访问权限。虽然Firebase iOS SDK公开auth api来创建/ signin / signout用户,但我找不到firebase SDK中的任何api,它可以提供对用户的读访问权限或写访问权限。
假设我使用api创建了两个用户user1,user2。如何授予对user1的读访问权限和对user2的读/写访问权限。所需的访问权限在整个数据库中。
是否可以通过Security Rules
(仅通过google firebase控制台中“数据库”选项卡下的“规则”部分中的JSON提供)?如果是,我们如何为不同的用户创建这种读/写访问?
如果可以通过Firebase iOS SDK然后使用哪个API?
由于
答案 0 :(得分:5)
开始时我很难理解,但规则非常灵活,您可以根据其他数据库内容来访问您的数据。基本上,您授予对节点的访问权限,并且该授权也适用于所有子节点,并且无法从树中的更深节点中删除。您可以在控制台中应用这些数据库规则,但是如果您还需要使用它来设置整个数据库的规则,则必须有api。它们必须是单个文档,因此您不想对用户进行硬编码,但是您可以将它们放在隐藏且无法访问的节点中,规则可以访问它。
例如,让我们假设您想要让人们请求与其他人成为朋友,并让其他人能够接受并将这两个人添加到朋友列表中。您可以使用与此类似的架构:
uid
"friends"
friendUid1
friendUid2
friendUid3
"private"
... some private data your friends can read
"friendRequests"
targetUid
requestorUid -> can be written to only by requestorUid
第一步是将值写入friendRequests/$targetUid/$requestorUid
。可以写入此节点的唯一人员是经过身份验证的requestorUid。 targetUid将被授予对targetUid节点的读访问权限,以便他们可以读取它,因为它是一个子节点,但不能写它。
然后,您可以根据$requestor/friends/$targetUid
的存在将friendRequests/targetUid/requestorUid
的写访问权授予$ targetUid。这允许接收到朋友请求的人将他们的OWN uid写入请求者的朋友列表,但前提是请求者已经在请求中写了他们自己的uid作为朋友。然后他们会将请求者的uid写入他们自己的朋友列表。如果登录用户的uid在他们的朋友列表中,他们可以访问私人数据。
{
"rules": {
"$uid": {
".read": "auth.uid === $uid",
".write": "auth.uid === $uid",
"friends": {
"$friendId": {
".write": "root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId"
}
},
"private": {
".read": "data.parent().child('friends').child(auth.uid).exists()"
}
},
"friendRequests": {
"$targetUid": {
".read": "auth.uid === $targetUid",
"$requestorUid": {
".write": "auth.uid === $requestorUid"
}
}
}
}
}
让我们使用一些真实的" ids并说uid 100想与uid 200成为朋友。他们会将自己的id 100写为200的请求,这是允许的,因为auth.uid将匹配$ requestorUid并匹配最后一个写规则:
ref = db.getReference("friendRequests/200/100");
ref.setValue(true);
当用户ID 200登录时,他们可以在friendRequests/200
读取他们所有的朋友请求。他们看到用户100要求成为他们的朋友,所以他们首先向users/200/friends
添加100。这是允许的,因为auth.uid将为200,并且它们对整个users/200
节点及其所有子节点具有完全读/写访问权限。
接下来,他们也可以写信给users/100/friends/200
,因为这条规则:
"root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId"
auth.uid
将为200,检查将会看到100要求成为200的朋友,因为friendRequests/200/100
存在且该节点只能由用户100写入。