对于启用了基于电子邮件/密码的身份验证的 Firebase 数据库
,我们如何向登录到 Firebase 支持的 iOS 应用程序的用户授予读/写访问权限。尽管 Firebase iOS SDK 公开了 auth api 以创建/登录/注销用户,但我在 firebase SDK 中找不到任何可以为用户提供读取访问或写入访问的 api。
假设我使用 api 创建了两个用户 user1 和 user2。如何授予 user1 读取权限和 user2 读取/写入权限。需要访问整个数据库。
是否可以仅通过安全规则
(在 google firebase 控制台的“数据库”选项卡下的“规则”部分中通过 JSON 提供)?如果是,我们如何为不同的用户创建这种读/写访问权限?
如果可以通过 Firebase iOS SDK,那么应该使用哪个 api?
谢谢
最佳答案
开始时我很难理解,但规则非常灵活,让您可以根据其他数据库内容访问您的数据。基本上,您授予对节点的访问权限,并且该授予也适用于所有子节点,并且不能从树中更深的节点中删除。您可以在控制台中应用这些数据库规则,但是如果您还需要使用它来为整个数据库设置规则,则必须有一个 api。它们必须是单个文档,因此您不想对用户进行硬编码,但您可以将它们放在一个隐藏且不可访问的节点中,规则可以访问它。
例如,假设您想让人们请求与其他人成为 friend ,并且其他人能够接受并将两个人都添加到 friend 列表中。你可以有一个类似于这样的模式:
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 节点的读取权限,这样他们就可以读取它,因为它是一个子节点,但不能写入它。
然后,您可以根据 friendRequests/targetUid/requestorUid
的存在,将对 $requestor/friends/$targetUid
的写入权限授予 $targetUid。这允许收到 friend 请求的人将他们自己的 uid 写入请求者的 friend 列表,但前提是请求者已经在成为 friend 的请求中写入了他们自己的 uid。然后他们会将请求者的 uid 写入他们自己的 friend 列表。如果登录用户的 uid 在他们的 friend 列表中,他们就可以访问私有(private)数据。
{
"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"
}
}
}
}
}
让我们使用一些“真实的”id 并假设 uid 100 想与 uid 200 成为 friend 。他们会写自己的 id 100 作为对 200 的请求,这是允许的,因为 auth.uid 将匹配 $requestorUid 并匹配最后写入规则:
ref = db.getReference("friendRequests/200/100");
ref.setValue(true);
当用户 id 200 登录时,他们可以在 friendRequests/200
读取他们所有的好友请求。他们看到用户 100 请求成为他们的 friend ,所以他们首先将 100 添加到 users/200/friends
。这是允许的,因为 auth.uid 将为 200,并且他们对整个 users/200
节点及其所有子节点具有完全读/写访问权限。
接下来他们也可以写入 users/100/friends/200
因为这个规则:
"root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId"
auth.uid
将为 200 并且检查将看到 100 要求与 200 成为 friend ,因为 friendRequests/200/100
存在并且该节点只能由用户 100。
关于ios - Firebase:如何为不同的用户提供读/写访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42104558/