首页 文章

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

提问于
浏览
2

对于启用了基于电子邮件/密码的身份验证的firebase数据库,我们如何授予登录Firebase支持的iOS应用程序的用户的读/写访问权限 . 虽然Firebase iOS sdk公开auth api来创建/ signin / signout用户,但我找不到firebase sdk中的任何api,它可以提供对用户的读访问权限或写访问权限 . 让我们假设我使用api创建了两个用户user1,user2 . 如何授予对user1的读访问权限和对user2的读/写访问权限 . 所需的访问权限在整个数据库中 . 是否可以通过安全规则(仅通过google firebase控制台中“数据库”选项卡下的“规则”部分中的JSON提供)?如果是,我们如何为不同的用户创建这种读/写访问?如果可以通过Firebase iOS SDk然后使用哪个api?

谢谢

1 回答

  • 3

    开始时我很难理解,但规则非常灵活,您可以根据其他数据库内容访问您的数据 . 基本上,您授予对节点的访问权限,并且该授权也适用于所有子节点,并且无法从树中的更深节点中删除 . 您可以在控制台中应用这些数据库规则,但是如果您还需要使用它来设置整个数据库的规则,则必须有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 . 这允许收到朋友请求的人将他们的OWN uid写入请求者's friend list, but only if the requestor had already write their own uid in a request to be a friend. They would then write the requestor' sid到他们自己的朋友列表 . 如果登录用户的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要求成为他们的朋友,所以他们首先将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的朋友因为 friendRequests/200/100 存在并且该节点仅可由用户100写入 .

相关问题