Ios Firebase:如何为不同的用户提供读/写访问权限?

Ios Firebase:如何为不同的用户提供读/写访问权限?,ios,firebase,firebase-realtime-database,firebase-authentication,firebase-security,Ios,Firebase,Firebase Realtime Database,Firebase Authentication,Firebase Security,对于启用了基于电子邮件/密码的身份验证的Firebase数据库,我们如何向登录Firebase支持的iOS应用程序的用户授予读/写访问权限。虽然Firebase iOS SDK公开了用于创建/登录/注销用户的auth api,但我在Firebase SDK中找不到任何可以为用户提供读访问或写访问的api 假设我使用api创建了两个用户user1和user2。如何授予user1读访问权限和user2读/写访问权限。所需的访问权限位于整个数据库上 是否仅通过安全规则(通过google firebas

对于启用了基于电子邮件/密码的身份验证的
Firebase数据库
,我们如何向登录Firebase支持的iOS应用程序的用户授予读/写访问权限。虽然Firebase iOS SDK公开了用于创建/登录/注销用户的auth api,但我在Firebase SDK中找不到任何可以为用户提供读访问或写访问的api

假设我使用api创建了两个用户user1和user2。如何授予user1读访问权限和user2读/写访问权限。所需的访问权限位于整个数据库上

是否仅通过
安全规则
(通过google firebase控制台数据库选项卡下规则部分中的JSON提供)就可以实现?如果是,我们如何为不同的用户创建这种读/写访问? 如果可以通过Firebase iOS SDK,那么使用哪种api


谢谢

开始时我很难理解,但规则非常灵活,允许您基于其他数据库内容访问数据。基本上,您授予对一个节点的访问权,该授权也适用于所有子节点,并且不能从树中更深的节点删除。您可以在控制台中应用这些数据库规则,但如果您还需要使用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
的写访问权限授予$targetUid。这允许收到好友请求的人将自己的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"
        }
      }
    }
  }
}
让我们使用一些“真实”的ID,并说UID100想与UID200成为朋友。他们将自己的id 100写入200的请求,这是允许的,因为auth.uid将匹配$requestorUid并匹配上一个写入规则:

ref = db.getReference("friendRequests/200/100");
ref.setValue(true);
当用户id 200登录时,他们可以在
friendRequests/200
上读取所有好友请求。他们看到用户100请求成为他们的朋友,所以他们首先将100添加到
users/200/friends
。这是允许的,因为auth.uid将是200,并且它们对整个
用户/200
节点及其所有子节点具有完全读/写访问权限

接下来,他们还可以向
用户/100/friends/200
写信,因为这条规则:

"root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId"

auth.uid
将是200,检查将看到100请求与200成为朋友,因为
friendRequests/200/100
存在,并且该节点只能由用户100写入。

Firebase数据库的安全模型在此处的文档中讨论:。它在Firebase服务器上强制执行,因此不特定于您的iOS客户端。我建议您研究文档,尝试使其适用于您的用例,如果您在实现规则时遇到问题,请回到这里。