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

时间:2017-02-08 04:11:44

标签: ios firebase firebase-realtime-database firebase-authentication firebase-security

对于启用了基于电子邮件/密码的身份验证的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?

由于

1 个答案:

答案 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写入。

相关问题