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

标签 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 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/

相关文章:

javascript - Firebase 条件/可选查询

iphone - 保存到 CoreData - 添加到顶部

ios - 带有 ipv6 的 libssh2 lib 不工作

ios - Flutter + Firebase 抛出未处理的异常 : This widget has been unmounted Error Using Navigator to change view

angular - 您如何确定用户是否已在 Angular Firebase 中通过身份验证?

firebase 云消息传递请求包含无效参数

firebase - 在 Firebase 中恢复数据库

iphone - 在应用内征求评论

javascript - 如何使用 firebase Auth 检索和处理重定向错误?

android - Firebase 实时数据库 : Using Firebase Realtime Database in always running service in Android