Firebase:如何为不同用户提供读/写访问权限?
对于启用基于电子邮件/密码的身份验证的Firebase数据库,我们如何授予对登录Firebase支持的iOS应用程序的用户的读/写访问权限。 尽管Firebase iOS sdk公开auth api来创建/登录/注销用户,但是我无法在firebase sdk中找到任何可以为用户提供读访问权限或写权限的api。 让我们假设我使用api创建了两个用户user1,user2。 我如何授予对user1的读取访问权限和对user2的读取/写入访问权限。 所需的访问权限在整个数据库上。 是否可以通过安全规则(只能通过谷歌Firebase控制台中数据库选项卡下的规则部分中的JSON提供)? 如果是,我们如何为不同的用户创建这样的读/写访问权限? 如果可以通过Firebase iOS SDk,然后使用哪个API?
谢谢
开始时对我来说很难理解,但规则非常灵活,可让您基于其他数据库内容访问数据。 基本上,您授予对节点的访问权限,并且该授权也适用于所有子级,并且不能从树中的更深层节点中删除。 您可以在控制台中应用这些数据库规则,但如果您还需要使用它来为整个数据库设置规则,则必须有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节点的读取访问权限,因此它们可以读取它,因为它是一个孩子,但不会写入它。
然后,根据friendRequests/targetUid/requestorUid
的存在,您可以将$requestor/friends/$targetUid
写入权限授予$requestor/friends/$targetUid
。 这允许接收到好友请求的人将他们的OWN 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"
}
}
}
}
}
让我们使用一些“真实”id并且说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写入。
上一篇: Firebase: How to provide read/write access to different users?
下一篇: How to allow read and write access to only auth users in Firebase?