热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Firebase:如何为不同用户提供读/写访问权限?》经验,为你挑选了1个好方法。

对于Firebase Database启用了基于电子邮件/密码的身份验证的用户,我们如何向登录到Firebase支持的iOS应用程序的用户授予读/写访问权限。尽管Firebase iOS SDK将身份验证api公开给创建/登录/注销用户,但是我在firebase SDK中找不到任何可以向用户提供读取或写入访问权限的api。

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

是否Security Rules只能通过(如Google Firebase控制台的“数据库”选项卡下的“规则”部分中的JSON提供)?如果是,我们如何为不同的用户创建这种读/写访问权限?如果可以通过Firebase iOS SDK进行操作,那么要使用哪个api?

谢谢



1> Jason Goemaa..:

一开始我很难理解,但是规则非常灵活,可以让您基于其他数据库内容访问数据。基本上,您授予对节点的访问权限,并且该授予也适用于所有子节点,并且不能从树的更深节点中删除。您可以在控制台中应用这些数据库规则,但是如果还需要使用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节点的读取访问权限,因此他们可以读取它,因为它是一个孩子,但不能写入它。

然后,您可以$requestor/friends/$targetUid根据的存在,授予对$ targetUid的写入权限friendRequests/targetUid/requestorUid。这允许接收到朋友请求的人将其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被要求成为他们的朋友,因此他们首先向添加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因为friendRequests/200/100存在而被要求与200成为朋友,并且该节点只能由用户100写入。


推荐阅读
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • Conflictwithfirebase11.8.0andgoogle-servicesplugin3.1.2 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 我们很高兴地宣布,GoogleDevelopers中国网站(developers.google.cn)正式发布!GoogleDevelopers中国网站 ... [详细]
  • IhaveaFirebasedatabasethatismodeledassuch:我有一个这样建模的Firebase数据库::users:some-random ... [详细]
author-avatar
缪宇驰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有